首页 > 其他分享 >Spring-@ControllerAdvice-全局处理注解

Spring-@ControllerAdvice-全局处理注解

时间:2024-03-07 16:22:34浏览次数:29  
标签:ControllerAdvice Spring annotation 注解 import model public

1,@ControllerAdvice 介绍

@ControllerAdvice 是 Spring 框架提供的一个注解,用于定义全局的异常处理器和全局数据绑定。它通常用于集中处理应用程序中的异常,并提供统一的异常处理逻辑。

2,@ControllerAdvice 的基本使用

package org.springframework.web.bind.annotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

@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 {};
}

1. @ControllerAdvice 注解是一个带有 @Component 注解的特殊注解,它会被 Spring 框架扫描并识别为全局异常处理器。

2. 一旦 Spring 框架发现了带有 @ControllerAdvice 注解的类,它就会将其实例化为一个 Bean,并将其注册到应用程序上下文中。

3. @ControllerAdvice注解可以通过结合其他注解来定义不同类型的全局处理器,包括:

  • @ExceptionHandler:用于定义特定类型的异常处理方法,当Controller层抛出异常时,Spring框架会根据异常类型选择合适的@ExceptionHandler方法进行处理,并返回相应的结果或视图。
  • @InitBinder:用于定制数据绑定的方法, 同样地,@InitBinder注解定义的方法会在数据绑定过程中被调用,用于定制数据绑定的逻辑。
  • @ModelAttribute:用于提供全局数据的方法,@ModelAttribute注解定义的方法会在每个请求处理方法执行之前被调用,用于提供全局的数据模型。

3,使用示例

1,@ExceptionHandler

自定义异常处理

  1. 自定义一个异常
public class CustomException extends RuntimeException{}
  1. 自定义异常处理器
package com.apz.demo.handler;

import com.apz.demo.exception.CustomException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author gx
 * @date 20221130
 * 自定义异常处理
 * ControllerAdvice 配合 ExceptionHandler 拦截 controller 的异常
 *
 * ResponseEntity 可以修改返回的 http 状态码
 */
@ControllerAdvice(basePackages = "com.apz.demo.controller")
public class CustomerExceptionHandler {
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseEntity error(CustomException e){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.parser());
    }
}

这里 error 方法,可以自定义返回数据,如果是 Json,就需要加上 ResponseBody。如果是重定向路径,就返回 ModelAndView 对象。

  1. 程序中抛出这个对应的异常
@RequestMapping("/demo1")
public String test() throws CustomException{
    throw CustomException.paramNullException("测试");
}    

当程序抛出异常时候,就会走自定义处理异常,返回数据到前端。

2,@ModelAttribute

全局参数绑定

  1. 自定义一个全局参数绑定
//第一种方式:这种方式直接放到 model 里
@ModelAttribute
public void modeAttrParam(Model model){
    model.addAttribute("l1", "yq");
    model.addAttribute("l2", "xx");
    model.addAttribute("l3", "yl");
}

//第二种方式:如果设置了 ss,就是把 key = ss,value 是整个 map 放到 model里,如果不设置 ss, 返回的变量名就是放到 model 里的 key。
@ModelAttribute("ss")
public Map<String, String> modeAttrParam1(){
    Map<String, String> map = new HashMap<>();
    map.put("key1", "value1");
    map.put("key2", "value2");
    map.put("key3", "value3");
    return map;
}
  1. 三种方式获取全局参数设置的值

@RequestMapping("/demo2")
public void test1(Model model){
    Map<String, Object> stringObjectMap = model.asMap();
    System.out.println(stringObjectMap);
}

@RequestMapping("/demo3")
public void test2(@ModelAttribute("l3") String globalAttr){
    System.out.println(globalAttr);
}

@RequestMapping("/demo4")
public void methodThree(ModelMap modelMap) {
    System.out.println(modelMap);
}

3,@InitBinder

参数绑定

  1. 定义参数绑定
@InitBinder
public void dateTypeBinder(WebDataBinder webDataBinder){
    //往数据绑定器中添加一个DateFormatter日期转化器。
    webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
  1. 接口参数会自动解析
@RequestMapping("/testInitBinder")
private String testInitBinder(Date date){
    System.out.println("date = " + date);
    return "RequsetInitBindDemo";
}

标签:ControllerAdvice,Spring,annotation,注解,import,model,public
From: https://www.cnblogs.com/cnff/p/17553488.html

相关文章

  • spring-JSON序列化
    1,使用场景。SpringBoot默认json为JackJson。在Controller需要返回Json数据时,我们使用了RestController,如果想对返回的数据进行一定的处理,也就是序列化对象为Json时使用。反序列化,就是当接收的参数想做一定处理,获取到处理后的数据时候。2,JsonSerializer序列化1,自定......
  • spring-HandlerMethodArgumentResolver-参数解析器
    1,参数解析器介绍  HandlerMehtodArgumentResolver,中文成为方法参数解析器,是SpringMvc组件的众多解析器之一,主要用来对Controller的方法参数进行处理。2,参数解析器的使用1,实现HandlerMethodArgumentResolver,自定义解析器publicclassMyHandlerMethodArgumentResolver......
  • Spring-@Validated-参数校验
    1.什么是javax.validationJSR303是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面(面向注解编程的时代),就可以在需要校验的时候进行校验了,在SpringBoot中已经包含在starter-web中,再其他项目中可以引用依赖,并自行......
  • Springcloud Alibaba-8-链路追踪
    1.基本概念在微服务架构中,一个请求可能需要调用很多个服务,若其中出现了错误很难去定位。链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等......
  • Spring反序列化失败 Type definition error: [simple type, class xxx.xxx.xxx]
    也许更好的阅读体验Typedefinitionerror:[simpletype,classcom.elm.po.CommonResult];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannotconstructinstanceofcom.elm.po.CommonResult(noCreators,likedefaultconstru......
  • SpringBoot使用外部Web容器的解决方案
    SpringBoot默认内嵌了Web容器(如Tomcat、Jetty或Undertow),这使得应用可以作为独立的可执行JAR或WAR文件运行,无需外部Web容器。然而,在某些情况下,你可能想要将SpringBoot应用部署到外部的Web容器中,比如ApacheTomcat或Jetty。嵌入式的Web容器:应用可以打包成可执行的Jar。优点:简单......
  • META-INF/spring.factories自动化配置
    META-INF/spring.factories文件是SpringBoot项目中非常重要的一个文件,用于声明各种自动配置类、监听器、初始化器等。这个文件通常用来启用和配置各种SpringBoot自动配置模块。具体来说,spring.factories文件采用Java的属性文件格式,其中包含了多个键值对,每个键代表一个......
  • 玩转SpringBoot:SpringBoot的几种定时任务实现方式
    引言在现代软件开发中,定时任务是一种常见的需求,用于执行周期性的任务或在特定的时间点执行任务。这些任务可能涉及数据同步、数据备份、报表生成、缓存刷新等方面,对系统的稳定性和可靠性有着重要的影响。SpringBoot提供了强大且简单的定时任务功能,使开发人员能够轻松地管理和执......
  • spring - string
    spring-string1.string在Java8及之前的版本中,字符串由不可变的Unicode字符数组组成。然而,大多数字符只需要8位(1个字节)来表示它们,而不是16位(字符大小)。为了改善内存消耗和性能,Java9引入了紧凑字符串。这意味着如果字符串仅包含1字节字符,它将使用Latin-1编码表示......
  • 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位
    说明所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面。究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸,自己当年也是这么过来的。今天我就毕其功于一役,解放大家的时间,让凡人的环境配置见鬼去吧......