Spring@RestControllerAdvice注解工作原理是怎样的?

2026-06-09 05:125阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1306个文字,预计阅读时间需要6分钟。

Spring@RestControllerAdvice注解工作原理是怎样的?

本文简要介绍了Spring注解@RestControllerAdvice的原理及解析,并通过示例代码介绍其应用。对于有学习或工作需求的朋友,具有一定的参考价值,可参考学习。前言:近年来,随着Spring框架的广泛应用,越来越多的开发者和企业开始关注Spring框架的内部机制。其中,@RestControllerAdvice注解作为Spring框架中的一个重要特性,被广泛应用于异常处理、日志记录等方面。一、@RestControllerAdvice原理

@RestControllerAdvice是Spring框架中的一个全局异常处理器,它可以将全局异常处理逻辑集中管理,提高代码的复用性和可维护性。该注解的作用类似于@ControllerAdvice,但@RestControllerAdvice主要用于@RestController注解的控制器。

@RestControllerAdvice注解具有以下特点:

1. 可以在类或接口上使用,用于处理@RestController注解的控制器中的异常。

2.可以自定义异常处理方法,实现对不同类型异常的处理。

3.可以使用@ExceptionHandler、@Advice、@Around等注解定义异常处理逻辑。

二、示例代码

以下是一个使用@RestControllerAdvice注解处理异常的示例代码:

java

@RestControllerAdvicepublic class GlobalExceptionHandler {

@ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(系统异常: + e.getMessage()); }}

在这个示例中,我们定义了一个GlobalExceptionHandler类,并使用@RestControllerAdvice注解将其标注为一个全局异常处理器。在类中,我们定义了一个handleException方法,该方法使用@ExceptionHandler注解,用于处理所有类型的Exception异常。当控制器中发生异常时,该方法会被调用,并返回一个包含错误信息的HTTP响应。

三、总结

本文简要介绍了Spring注解@RestControllerAdvice的原理及解析,并通过示例代码展示了其应用。对于有学习或工作需求的朋友,本文具有一定的参考价值,可参考学习。需要注意的是,本文内容较为简略,如需深入了解,请参考Spring官方文档及相关教程。

这篇文章主要介绍了Spring注解@RestControllerAdvice原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

前段时间部门搭建新系统,需要出异常后统一接口的返回格式,于是用到了Spring的注解@RestControllerAdvice。现在把此注解的用法总结一下。

用法

首先定义返回对象ResponseDto

package com.staff.points.common; import lombok.Data; import java.io.Serializable; @Data public class ResponseDto<T> implements Serializable { private static final long serialVersionUID = -284719732991678911L; private String code; private String message; private T data; public static <T> ResponseDto<T> assemblingSuccessResponse(T data) { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode()); responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage()); responseDto.setData(data); return responseDto; } public static <T> ResponseDto<T> assemblingSuccessResponse() { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode()); responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage()); responseDto.setData(null); return responseDto; } public static <T> ResponseDto<T> assemblingFailureResponse(ResponseCodeEnum data) { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(data.FAILURE.getCode()); responseDto.setMessage(data.FAILURE.getMessage()); return responseDto; } public static <T> ResponseDto<T> assemblingFailureResponse() { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.FAILURE.getCode()); responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage()); return responseDto; } }

然后定义返回码的枚举类,此处只定义了两种,有需要可以往下添加很多。

package com.staff.points.common; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum ResponseCodeEnum { SUCCESS("00", "成功"), FAILURE("01", "系统异常"); private String code; private String message; }

下面是自定义的异常类

package com.staff.points.common; import lombok.Data; @Data public class StaffPointsException extends RuntimeException{ private String code; private String message; public StaffPointsException () {} public StaffPointsException (Exception e) { super(e); } public StaffPointsException (String code, String message) { super(message); this.code = code; this.message = message; } public StaffPointsException (ResponseCodeEnum codeEnum) { super(codeEnum.getMessage()); this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); } }

然后是关键的@RestControllerAdvice修饰的类

package com.staff.points.exception; import com.staff.points.common.ResponseCodeEnum; import com.staff.points.common.ResponseDto; import com.staff.points.common.StaffPointsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Component public class UnifyExceptionHandler { private Logger logger = LoggerFactory.getLogger(UnifyExceptionHandler.class); @ExceptionHandler(Exception.class) public ResponseDto handlerCommonException (Exception e) { ResponseDto responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.FAILURE.getCode()); responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage()); logger.info("UnifyExceptionHandler.handlerCommonException exception:" + e); return responseDto; } // 报StaffPointException时,对其进行拦截并处理的方法 @ExceptionHandler(StaffPointsException.class) public ResponseDto handlerCustomizeException (StaffPointsException e) { ResponseDto responseDto = new ResponseDto<>(); responseDto.setCode(e.getCode()); responseDto.setMessage(e.getMessage()); logger.info("UnifyExceptionHandler.handlerCustomizeException StaffPointsException:" + e); return responseDto; } }

运行代码时,如果出现了StaffPointException,那么就会被拦截进入第27行的方法(就是说可以自由的在业务代码里往外throw自定义异常了);如果出现了其他的异常,则进入18行的方法,统一返回。

验证一下,在代码里造一个NPE异常时,返回结果:

{ "code": "01", "message": "系统异常", "data": null }

造一个StaffPointsException异常时,返回结果:

{ "code": "99", "message": "自定义业务异常", "data": null }

它的作用原理,大体是先在spring初始化时将类扫描进容器,出异常后,在DispatcherServlet类的doDispatch方法中调用了对异常的拦截处理。

小结

Spring@RestControllerAdvice注解工作原理是怎样的?

看@RestControllerAdvice源码可以知道,它就是@ControllerAdvice和@ResponseBody的合并。此注解通过对异常的拦截实现的统一异常返回处理,如果大家在项目中有类似的需求,不妨试一下,好用又方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计1306个文字,预计阅读时间需要6分钟。

Spring@RestControllerAdvice注解工作原理是怎样的?

本文简要介绍了Spring注解@RestControllerAdvice的原理及解析,并通过示例代码介绍其应用。对于有学习或工作需求的朋友,具有一定的参考价值,可参考学习。前言:近年来,随着Spring框架的广泛应用,越来越多的开发者和企业开始关注Spring框架的内部机制。其中,@RestControllerAdvice注解作为Spring框架中的一个重要特性,被广泛应用于异常处理、日志记录等方面。一、@RestControllerAdvice原理

@RestControllerAdvice是Spring框架中的一个全局异常处理器,它可以将全局异常处理逻辑集中管理,提高代码的复用性和可维护性。该注解的作用类似于@ControllerAdvice,但@RestControllerAdvice主要用于@RestController注解的控制器。

@RestControllerAdvice注解具有以下特点:

1. 可以在类或接口上使用,用于处理@RestController注解的控制器中的异常。

2.可以自定义异常处理方法,实现对不同类型异常的处理。

3.可以使用@ExceptionHandler、@Advice、@Around等注解定义异常处理逻辑。

二、示例代码

以下是一个使用@RestControllerAdvice注解处理异常的示例代码:

java

@RestControllerAdvicepublic class GlobalExceptionHandler {

@ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(系统异常: + e.getMessage()); }}

在这个示例中,我们定义了一个GlobalExceptionHandler类,并使用@RestControllerAdvice注解将其标注为一个全局异常处理器。在类中,我们定义了一个handleException方法,该方法使用@ExceptionHandler注解,用于处理所有类型的Exception异常。当控制器中发生异常时,该方法会被调用,并返回一个包含错误信息的HTTP响应。

三、总结

本文简要介绍了Spring注解@RestControllerAdvice的原理及解析,并通过示例代码展示了其应用。对于有学习或工作需求的朋友,本文具有一定的参考价值,可参考学习。需要注意的是,本文内容较为简略,如需深入了解,请参考Spring官方文档及相关教程。

这篇文章主要介绍了Spring注解@RestControllerAdvice原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

前段时间部门搭建新系统,需要出异常后统一接口的返回格式,于是用到了Spring的注解@RestControllerAdvice。现在把此注解的用法总结一下。

用法

首先定义返回对象ResponseDto

package com.staff.points.common; import lombok.Data; import java.io.Serializable; @Data public class ResponseDto<T> implements Serializable { private static final long serialVersionUID = -284719732991678911L; private String code; private String message; private T data; public static <T> ResponseDto<T> assemblingSuccessResponse(T data) { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode()); responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage()); responseDto.setData(data); return responseDto; } public static <T> ResponseDto<T> assemblingSuccessResponse() { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode()); responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage()); responseDto.setData(null); return responseDto; } public static <T> ResponseDto<T> assemblingFailureResponse(ResponseCodeEnum data) { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(data.FAILURE.getCode()); responseDto.setMessage(data.FAILURE.getMessage()); return responseDto; } public static <T> ResponseDto<T> assemblingFailureResponse() { ResponseDto<T> responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.FAILURE.getCode()); responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage()); return responseDto; } }

然后定义返回码的枚举类,此处只定义了两种,有需要可以往下添加很多。

package com.staff.points.common; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum ResponseCodeEnum { SUCCESS("00", "成功"), FAILURE("01", "系统异常"); private String code; private String message; }

下面是自定义的异常类

package com.staff.points.common; import lombok.Data; @Data public class StaffPointsException extends RuntimeException{ private String code; private String message; public StaffPointsException () {} public StaffPointsException (Exception e) { super(e); } public StaffPointsException (String code, String message) { super(message); this.code = code; this.message = message; } public StaffPointsException (ResponseCodeEnum codeEnum) { super(codeEnum.getMessage()); this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); } }

然后是关键的@RestControllerAdvice修饰的类

package com.staff.points.exception; import com.staff.points.common.ResponseCodeEnum; import com.staff.points.common.ResponseDto; import com.staff.points.common.StaffPointsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Component public class UnifyExceptionHandler { private Logger logger = LoggerFactory.getLogger(UnifyExceptionHandler.class); @ExceptionHandler(Exception.class) public ResponseDto handlerCommonException (Exception e) { ResponseDto responseDto = new ResponseDto<>(); responseDto.setCode(ResponseCodeEnum.FAILURE.getCode()); responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage()); logger.info("UnifyExceptionHandler.handlerCommonException exception:" + e); return responseDto; } // 报StaffPointException时,对其进行拦截并处理的方法 @ExceptionHandler(StaffPointsException.class) public ResponseDto handlerCustomizeException (StaffPointsException e) { ResponseDto responseDto = new ResponseDto<>(); responseDto.setCode(e.getCode()); responseDto.setMessage(e.getMessage()); logger.info("UnifyExceptionHandler.handlerCustomizeException StaffPointsException:" + e); return responseDto; } }

运行代码时,如果出现了StaffPointException,那么就会被拦截进入第27行的方法(就是说可以自由的在业务代码里往外throw自定义异常了);如果出现了其他的异常,则进入18行的方法,统一返回。

验证一下,在代码里造一个NPE异常时,返回结果:

{ "code": "01", "message": "系统异常", "data": null }

造一个StaffPointsException异常时,返回结果:

{ "code": "99", "message": "自定义业务异常", "data": null }

它的作用原理,大体是先在spring初始化时将类扫描进容器,出异常后,在DispatcherServlet类的doDispatch方法中调用了对异常的拦截处理。

小结

Spring@RestControllerAdvice注解工作原理是怎样的?

看@RestControllerAdvice源码可以知道,它就是@ControllerAdvice和@ResponseBody的合并。此注解通过对异常的拦截实现的统一异常返回处理,如果大家在项目中有类似的需求,不妨试一下,好用又方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。