SpringMVC中的@ControllerAdvice使用场景详解
@ControllerAdvice使用场景
在Spring MVC进行调用的过程中,会有很多的特殊的需求。比如全局异常,分页信息和分页搜索条件,请求时带来返回时还得回显页面。
Spring提供@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 {}; // @Controller或者@RestController的类 的数据 Class<?>[] assignableTypes() default {}; // 控制范围可以用注解进行配置 Class<? extends Annotation>[] annotations() default {}; }
1、ExceptionHandler
系统比较庞大时很多的异常是不能控制,或者未知的,不能将所有的sql异常,反射异常,类不存在等抛到页面上展示给用户。
则需要一个全局的拦截器处理,Spring 提供了@ExceptionHandler处理方式。
1)、全局异常处理定义
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { /** * 错误后返回json * 如果想跳转到专门的异常界面,则可以返回{@link org.springframework.web.servlet.ModelAndView} * * @return 标准异常json */ @ResponseBody @ExceptionHandler(Exception.class) public Map<String, String> handler() { Map<String, String> errorMap = new HashMap<String, String>(16); errorMap.put("code", "500"); errorMap.put("msg", "系统异常,请稍后重试"); return errorMap; } }
2)、控制器方法调用异常
@RestController public class ControllerAdviceDemoController { @ResponseBody @RequestMapping("bindException") public String bindException() { getMessage(); return "ok"; } private void getMessage() { throw new RuntimeException("未知异常!"); } }
3)、访问效果
2、InitBinder
数据绑定有很多的场景,当前比如前端传入的日期为字符串类型,后端按照Format进解析为日期。
1)、全局日期绑定定义
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { @InitBinder("date") public void globalInitBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); } }
2)、控制器方法调用日期转换
@RestController public class ControllerAdviceDemoController { @ResponseBody @RequestMapping(value = "/initBind", method = RequestMethod.GET) public String detail(@RequestParam("id") long id, Date date) { System.out.println(date); System.out.println(id); return "ok"; } }
3)、收到的日期类型效果
访问地址为://127.0.0.1:9999/initBind?id=123&date=2019-12-30
3、ModelAttribute
先看看@ModelAttribute的注解信息,元注解@Target指定可以修饰方法参数和方法(全局)。当前模拟一种常见,就是将所有输出的信息都加上当前的平台信息(比如版本等公共信息,这种需求还是比较多的)。
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean binding() default true; }
1)、全局返回属性添加
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "hello"); HashMap<String, String> map = new HashMap<>(16); map.put("version", "1.0.0"); map.put("name", "XXX平台"); model.addAttribute("platform", map); } }
2)、控制器方法访问
@RestController public class ControllerAdviceDemoController { @GetMapping("/modelAttributeTest") private String modelAttributeTest(@ModelAttribute("msg") String msg, @ModelAttribute("platform") Map<String, String> platform) { String result = "msg:" + msg + "<br>" + "info:" + platform; return result; } }
3)、输出效果
到此这篇关于SpringMVC中的@ControllerAdvice使用场景详解的文章就介绍到这了,更多相关@ControllerAdvice使用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue+springboot读取git的markdown文件并展示功能
Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 JavaScript 库,使用 Markdown-it,你可以将 Markdown 文本解析为 HTML 输出,并且可以根据需要添加功能、扩展语法或修改解析行为,本文介绍vue+springboot读取git的markdown文件并展示,感兴趣的朋友一起看看吧2024-01-01解决IDEA报错,无效的源发行版 无效的目标发行版:22问题
在项目编译过程中,可能会出现“无效的源发行版”或“无效的目标发行版”的报错信息,原因通常是编译使用的JDK版本与项目设置的发布版本不一致,解决这类问题的办法是统一JDK版本,具体操作为:在IDE的项目设置中(如File->ProjectStructure->ProjectSettings)2024-10-10
最新评论