springmvc实用篇 -- @ControllerAdvice

@ControllerAdvice该注解我相信大多数人都熟悉,顾名思义,这是一个增强的 Controller。使用这个可以实现三个方面的功能:

1).全局异常捕捉处理:@ExceptionHandler

2).全局数据绑定:@ModelAttribute

3).全局数据预处理:@InitBinder

下面我们来展示下该注解的魅力

一、全局异常捕捉处理:@ExceptionHandler

1.创建controller:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/exception")
    public String exception(){
        int i = 1/0;//这里抛出一个异常
        return "hello springmvc!";
    }
}

2.创建controllerAdvice:

@ControllerAdvice("com.example.demo.controller")
public class MyControllerAdvice {
    @ExceptionHandler
    @ResponseBody
    public Map handleException(Throwable throwable){
        Map res = new HashMap();
        res.put("error","内部异常,请稍后再试");
        if(throwable instanceof Exception){
            res.put("msg",throwable.getMessage());
            res.put("code",0000);
        }
        return res;
    }
}

@ControllerAdvice("com.example.demo.controller")这里表示只对该包下面有效增强

@ExceptionHandler 注解用来表示异常的处理类型,这里没有写表示所有异常类型都进入处理,当然如果我们指明是比如空指针异常@ExceptionHandler(NullpointerException.class),这样就表示空指针异常才会进入处理

3.执行查看结果:

这样处理异常是不是很优雅,让异常优雅的返回给浏览器

二、全局数据绑定:@ModelAttribute

1.创建controller:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/name")
    public String index(@ModelAttribute("name") String name){
        return "hello springmvc!;name:"+name;
    }
   }

2.创建controllerAdvice:

@ControllerAdvice("com.example.demo.controller")
public class MyControllerAdvice {

    @ModelAttribute("name")
    public String param(){
        return "cwh";
    }
}

 3.执行查看结果:

这样我们就将“cwh”绑定到name这个属性上

三、 全局数据预处理:@InitBinder

1.创建controller:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index(@ModelAttribute("user")UserA userA){
        return "hello springmvc!userA:"+userA;
    }
}

2.创建controllerAdvice:

@ControllerAdvice("com.example.demo.controller")
public class MyControllerAdvice {
 @InitBinder("user")
    public void InitBinder(WebDataBinder webDataBinder){
        webDataBinder.setFieldDefaultPrefix("user.");
    }

}

3.执行结果:

这样我们在请求的时候加上user.前缀的时候就会将该属性值绑定到对应user对象上,主要的用处就在于多个对象属性同名时可以利用此方法来区分请求的属性

 

posted @ 2020-04-12 22:09  menco  阅读(17)  评论(0)    收藏  举报