SpringMVC中的@ControllerAdvice使用场景详解

 更新时间:2024年01月03日 08:31:52   作者:it_lihongmin  
这篇文章主要介绍了SpringMVC中的@ControllerAdvice使用场景详解,在Spring MVC进行调用的过程中,会有很多的特殊的需求,比如全局异常,分页信息和分页搜索条件,请求时带来返回时还得回显页面,需要的朋友可以参考下

@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使用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据

    SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据

    我们经常会遇到需要传递对象的场景,有时候,我们需要将一个对象的数据传递给另一个对象进行处理,但是又不希望直接暴露对象的内部结构和实现细节,所以本文给大家介绍了SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据,需要的朋友可以参考下
    2024-03-03
  • 深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和区别以及如何应用

    深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和区别以及如何应用

    po vo bo dto dao 和 pojo 是软件开发中经常使用的一些概念,用于设计和实现对象模型,下面将分别解释这些概念的含义及其在开发中的应用,这篇文章主要给大家介绍了关于Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和区别以及如何应用的相关资料,需要的朋友可以参考下
    2024-08-08
  • Java实现简单的斗地主游戏

    Java实现简单的斗地主游戏

    这篇文章主要为大家详细介绍了Java实现简单的斗地主游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 解决logback使用${spring.application.name}日志打印路径的问题

    解决logback使用${spring.application.name}日志打印路径的问题

    这篇文章主要介绍了解决logback使用${spring.application.name}日志打印路径的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 关于jar包增量更新分析

    关于jar包增量更新分析

    这篇文章主要介绍了关于jar包增量更新分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java NIO 中 Selector 解析

    Java NIO 中 Selector 解析

    这篇文章主要介绍了Java NIO 中 Selector,Selector即选择器,选择器提供选择执行已经就绪的任务的能力即为翻译为多路复用,下面文章对Selector详细介绍内容,需要的小伙伴可以参考一下
    2022-02-02
  • Java Spring中Bean的作用域及生命周期

    Java Spring中Bean的作用域及生命周期

    这篇文章主要介绍了Java Spring中Bean的作用域及生命周期,Bean的作用域默认是单例模式的,也就是说所有⼈的使⽤的都是同⼀个对象,更多相关内容需要的朋友可以参考一下
    2022-08-08
  • Spring使用Configuration注解管理bean的方式详解

    Spring使用Configuration注解管理bean的方式详解

    在Spring的世界里,Configuration注解就像是一位细心的园丁,它的主要职责是在这个繁花似锦的园子里,帮助我们声明和管理各种各样的bean,本文给大家介绍了在Spring中如何优雅地管理你的bean,需要的朋友可以参考下
    2024-05-05
  • Java中的事件处理机制详解

    Java中的事件处理机制详解

    这篇文章主要介绍了Java中的事件处理机制详解,Java事件处理是采取"委派事件模型",当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类创建对象,把它称为"事件的对象",需要的朋友可以参考下
    2023-10-10
  • SpringBoot配置Access-Control-Allow-Origin教程

    SpringBoot配置Access-Control-Allow-Origin教程

    文章介绍了三种配置Spring Boot跨域访问的方法:1. 使用过滤器;2. 在WebConfig配置文件中设置;3. 通过注解配置,作者分享了个人经验,并鼓励读者支持脚本之家
    2025-03-03

最新评论