项目开发:@ControllerAdvice注解的基本应用

简介

@ControllerAdvice 是 Spring 框架中提供的一个注解,用于定义一个组件,该组件可以集中处理来自不同控制器的异常或提供统一的拦截器功能。它主要用于以下几个方面:

  1. 全局异常处理:通过结合 @ExceptionHandler 注解,可以捕获和处理在控制器中抛出的异常。
  2. 全局拦截器:通过实现 HandlerInterceptor 接口,并在类上使用 @ControllerAdvice 注解,可以实现一个全局的拦截器,对控制器的方法调用进行拦截。
  3. 全局数据绑定:通过结合 @InitBinder 注解,可以在控制器方法执行前对数据绑定进行预处理。

基本用法

全局异常处理

假设我们想要捕获并统一处理所有控制器抛出的 ArithmeticException 异常:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ArithmeticException.class)
    public ResponseEntity<Object> handleArithmeticException(ArithmeticException ex) {
        // 定义错误信息
        ApiError apiError = new ApiError("An arithmetic error occurred", ex.getMessage());
        // 返回错误响应
        return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);
    }
}

在这个例子中,任何控制器抛出的 ArithmeticException 都会被 GlobalExceptionHandler 类中的 handleArithmeticException 方法捕获,并返回一个包含错误信息的响应。

全局拦截器

创建一个全局拦截器来记录每个请求的处理时间:

@ControllerAdvice
public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("PreHandle: " + request.getRequestURI());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("PostHandle: " + request.getRequestURI());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long timeTaken = System.currentTimeMillis() - request.getAttribute("startTime") == null ? 0 : (Long) request.getAttribute("startTime");
        System.out.println("AfterCompletion: " + request.getRequestURI() + ", Time Taken: " + timeTaken + "ms");
    }
}

preHandle 方法中,你可以在控制器方法执行前进行一些操作,例如记录开始时间。postHandle 方法在控制器方法执行后执行,而 afterCompletion 方法在视图渲染后执行,适合用于记录请求处理的总时间。

全局数据绑定

自定义数据绑定:

@ControllerAdvice
public class MyDataBinder {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 可以在这里自定义属性编辑器
        binder.registerCustomEditor(MyObject.class, new MyObjectEditor());
    }
}

在这个例子中,我们通过 @InitBinder 注解定义了一个方法,该方法将在每个控制器方法调用之前执行,用于注册自定义的数据绑定行为。

注解参数

1.value(): String[]

用于指定要应用通知的包名。
例如:@ControllerAdvice(“org.example.controllers”)

2.basePackages(): String[]

与 value() 相同,用于指定要应用通知的包名。
例如:@ControllerAdvice(basePackages = “org.example.controllers”)

3.basePackageClasses(): Class<?>[]

用于指定要应用通知的基础包类。
例如:@ControllerAdvice(basePackageClasses = MyController.class)

4.assignableTypes(): Class<?>[]

用于指定要应用通知的特定类型。
例如:@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})

5.annotations(): Class<? extends Annotation>[]

用于指定要应用通知的注解类型。
例如:@ControllerAdvice(annotations = RestController.class)

三.注解组成

@ControllerAdvice 实际上是一个组合注解(meta-annotation),它由几个其他的 Spring 注解组成。

@ControllerAdvice 的注解定义大致如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
    // ... 参数定义
}

从这个定义中,我们可以看到 @ControllerAdvice 主要由以下注解组成:

  1. @Target(ElementType.TYPE)
    指定该注解可以应用于类级别。

  2. @Retention(RetentionPolicy.RUNTIME)
    指定该注解在运行时可用。

  3. @Documented
    表示该注解应该被包含在 JavaDoc 中。

  4. @Component
    这是最关键的组成部分。@Component 使得被 @ControllerAdvice 注解的类成为 Spring 容器管理的一个组件。

@Component 的存在意味着:

  • @ControllerAdvice 注解的类会被自动检测并注册为 Spring Bean。
  • 它允许该类被 Spring 的组件扫描机制识别和管理。

虽然 @ControllerAdvice 本身并不直接包含如 @ExceptionHandler、@InitBinder 或 @ModelAttribute 这样的功能性注解,但它为这些注解提供了一个全局的应用上下文。当与这些注解结合使用时,@ControllerAdvice 使得它们的作用范围扩展到了多个控制器。

重要的是要注意,@ControllerAdvice 本身并不提供任何具体的功能。它主要作为一个标记,告诉 Spring 框架这个类应该被特殊处理,允许其中的方法(通过其他注解如 @ExceptionHandler 等标记)应用于多个控制器。

总结

@ControllerAdvice 主要是通过 @Component 注解实现其核心功能,而其他的元注解(@Target, @Retention, @Documented)则提供了额外的元数据信息。这种组合使得 @ControllerAdvice 成为一个强大而灵活的工具,用于在 Spring MVC 应用中实现全局的控制器相关功能。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: @ControllerAdvice 注解是一种特殊的@Component,它可以用来全局处理控制器中的异常。它可以在控制器中定义一个通用的异常处理方法,以处理所有控制器中抛出的异常,而无需在每个控制器中定义异常处理方法。 ### 回答2: @ControllerAdvice注解是Spring框架中的一个注解,用于定义全局异常处理器。它可以捕获在Controller层中抛出的异常,并对其进行统一的处理和转换。 @ControllerAdvice注解可以应用于类上,表示该类是一个全局异常处理类。它可以通过设置basePackages属性来指定需要处理异常的Controller所在的包路径。同时,它还可以通过设置annotations属性来指定需要处理的Controller类的注解。 使用@ControllerAdvice注解的类中的方法可以添加其他异常处理注解,比如@ExceptionHandler、@InitBinder和@ModelAttribute。这些注解可以用于定义特定的异常处理方法,达到根据不同的异常类型进行不同的异常处理的效果。 @ControllerAdvice注解的异常处理方法可以接受一个或多个异常类型参数,表示要处理的异常类型。在方法体中,可以对异常进行处理,比如打印日志、转换异常信息、返回错误页面等。 对于异常处理方法,可以设置返回值类型,返回值可以是ModelAndView、ResponseEntity或者@ResponseBody注解修饰的对象。通过返回值,可以指定异常处理后的跳转页面、返回错误信息等。 需要注意的是,当出现多个全局异常处理类时,Spring框架会按照顺序依次调用这些异常处理类的方法进行异常处理,直到找到一个匹配的处理方法为止。因此,在编写多个全局异常处理类时,应确保处理方法的顺序是正确的。 总的来说,@ControllerAdvice注解是一个非常强大的异常处理功能,它能够将所有Controller层抛出的异常进行统一的处理,提高代码的可维护性和可重用性。 ### 回答3: @ControllerAdvice注解是Spring MVC框架中的一个注解,用于定义一个全局的异常处理类。它可以被用于定义一组可被所有@Controller注解的类所共享的通用异常处理逻辑。当控制器方法或请求处理过程中发生异常时,@ControllerAdvice注解会捕获这些异常,并根据定义的处理逻辑进行处理。 @ControllerAdvice注解的使用步骤如下: 1. 创建一个类,并使用@ControllerAdvice注解进行注解。这个类通常放在与其他控制器类相同的包或子包下。 2. 在被@ControllerAdvice注解的类中,可以定义多个带有@ExceptionHandler注解的方法。这些方法用于处理特定类型的异常。例如,可以定义一个方法用于处理NullPointerException,另一个方法用于处理IOException等。 3. 在被@ControllerAdvice注解的类中,还可以定义带有@ModelAttribute注解的方法。这些方法可以添加全局的模型属性,这些属性可以在所有的@RequestMapping注解的方法中使用。 4. 在Spring MVC配置中,需要配置扫描被@ControllerAdvice注解的类。 @ControllerAdvice注解的优势在于它能够提供可重用的全局异常处理逻辑。它可以将异常处理逻辑与控制器类完全解耦,从而提高代码的可读性和可维护性。此外,@ControllerAdvice注解还可以用于添加全局的模型属性,进一步简化了开发过程。 总结来说,@ControllerAdvice注解是Spring MVC框架中用于定义全局异常处理的注解。通过它,我们可以定义一组可以被所有@Controller注解的类所共享的通用异常处理逻辑,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值