有哪些做鸭子网站/seo推广一年要多少钱
对于@ControllerAdvice注解,我们使用较多和熟悉的是结合@ExceptionHandler注解用于全局异常的处理。
其实,ControllerAdvice拆分开来就是Controller + Advice;Advice又是Spring Aop中的切面,用于封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。@ControllerAdvice的用法基本是将其声明在某个bean上,然后在该bean的方法上使用其他的注解来指定不同的织入逻辑。不过这里@ControllerAdvice并不是使用AOP的方式来织入业务逻辑的,而是Spring内置对其各个逻辑的织入方式进行了内置支持。
在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中。
下面针对@ExceptionHandler、@InitBinder、@ModelAttribute这三个注解进行说明:
- @ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的;
- @InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的;
- @ModelAttribute,表示其标注的方法将会在目标Controller方法执行之前执行。
先看@ControllerAdvice的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {@AliasFor("basePackages")String[] value() default {};@AliasFor("value")String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] assignableTypes() default {};Class<? extends Annotation>[] annotations() default {};
}
传递basePackage,声明的类(是一个数组)指定的Annotation参数,具体参考:spring framework doc
@ExceptionHandler
捕获Controller中抛出的指定类型的异常,可以处理全局和局部异常。
/*** 公共异常处理类* @author wangchengxi* @date 2019/1/6 11:20*/
@ControllerAdvice
public class BaseExceptionHandler {// @ExceptionHandler : 该方法需要处理那种异常@ExceptionHandler(Exception.class)@ResponseBodypublic Result error1(Exception e) {return new Result(false, StatusCode.ERROR, e.getMessage());}// 空指针异常处理@ExceptionHandler(NullPointerException.class)public Result error2(Exception e) {return new Result(false, StatusCode.ERROR, e.getMessage());}// 运行时异常处理@ExceptionHandler(RuntimeException.class)public Result error3(Exception e) {return new Result(false, StatusCode.ERROR, e.getMessage());}
}
@InitBinder
绑定自定义的一些特殊参数,这些是Spring没有提供直接支持的,比如Date。
@ControllerAdvice
public class BaseExceptionHandler { // 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器@InitBinderpublic void initWebBinder(WebDataBinder binder){//对日期的统一处理binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));//添加对数据的校验//binder.setValidator();}
}
@ModelAttribute
结合@ControllerAdvice,用于方法声明上,该方法将会在@ControllerAdvice所指定的范围内的所有接口方法执行之前执行,并且@ModelAttribute标注的方法的返回值还可以供给后续会调用的接口方法使用。
@ControllerAdvice
public class BaseExceptionHandler { // 把值绑定到Model中,使全局@RequestMapping可以获取到该值@ModelAttributepublic void addAttribute(Model model) {model.addAttribute("attribute", "The Attribute");}
}// 如果使用name或value属性,则指定的是返回值的名称
如:
@ModelAttribute(value = "The Attribute")
也可以定义在方法参数上:
@RequestMapping(method = RequestMethod.GET)public ModelAndView detail(@RequestParam("id") long id, @ModelAttribute("message") String message) {ModelAndView view = new ModelAndView("user");User user = userService.detail(id);view.addObject("user", user);return view;}
以上是我根据自己的学习总结已经在网上查找的一些相关资料文档做的小结。