SpringBoot全局异常统一处理

「爱情、让人受尽委屈。」 2023-06-30 11:54 172阅读 0赞

1.项目demo地址

链接:https://pan.baidu.com/s/1U-AKOb69J0J-pbzTLaSMHw
提取码:cbej

2.定义统一返回值

  1. @JsonInclude(JsonInclude.Include.NON_NULL) //null值不显示
  2. public class ResultVO<T> implements Serializable {
  3. private static final String RESULT_SUCCESS = "00000000";
  4. private static final long serialVersionUID = 1L;
  5. private String resultCode = RESULT_SUCCESS;
  6. private String resultMsg = "SUCCESS";
  7. private T data;
  8. public ResultVO() {
  9. }
  10. public ResultVO(GlobalStatusCode globalStatusCode) {
  11. this(globalStatusCode, null);
  12. }
  13. public ResultVO(String statusCode, String message) {
  14. this(statusCode, message, null);
  15. }
  16. public ResultVO(GlobalStatusCode globalStatusCode, T data) {
  17. this(globalStatusCode.getStatusCode(), globalStatusCode.getMessage(), data,null);
  18. }
  19. /**
  20. *
  21. * @param globalStatusCode
  22. * @param data
  23. * @param s message 中可以存在{}占位符,通过此参数按照顺序逐个替换
  24. */
  25. public ResultVO(GlobalStatusCode globalStatusCode, T data, String... s) {
  26. this(globalStatusCode.getStatusCode(), globalStatusCode.getMessage(), data,s);
  27. }
  28. public ResultVO(String resultCode, String resultMsg, T data) {
  29. this.data = data;
  30. this.resultMsg = resultMsg;
  31. this.resultCode = resultCode;
  32. }
  33. public ResultVO(String resultCode, String resultMsg, T data, String... s) {
  34. this.data = data;
  35. this.resultMsg = resultMsg;
  36. this.resultCode = resultCode;
  37. if(s != null){
  38. for(String _s :s){
  39. this.resultMsg = this.resultMsg.replace("{}",_s);
  40. }
  41. }
  42. }
  43. public String getResultCode() {
  44. return resultCode;
  45. }
  46. public void setResultCode(String resultCode) {
  47. this.resultCode = resultCode;
  48. }
  49. public String getResultMsg() {
  50. return resultMsg;
  51. }
  52. public void setResultMsg(String resultMsg) {
  53. this.resultMsg = resultMsg;
  54. }
  55. public T getData() {
  56. return data;
  57. }
  58. public void setData(T data) {
  59. this.data = data;
  60. }
  61. public void setStatusCode(GlobalStatusCode statusCode) {
  62. this.resultCode = statusCode.getStatusCode();
  63. this.resultMsg = statusCode.getMessage();
  64. }
  65. public boolean hasError() {
  66. return !StringUtils.equalsIgnoreCase(this.getResultCode(), RESULT_SUCCESS);
  67. }
  68. }

2.定义统一异常处理类

  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3. private static final Logger LOGGER = LoggerFactory
  4. .getLogger(GlobalExceptionHandler.class);
  5. @ExceptionHandler(value = GlobalException.class)
  6. @ResponseBody
  7. public ResultVO ErrorHandler(GlobalException e) {
  8. LOGGER.error("异常信息GlobalException:"+e.getMessage(), e);
  9. return new ResultVO(e.getStatusCode(),e.getMessage());
  10. }

3.定义统一异常实现runtimeExceprion

  1. public class GlobalException extends RuntimeException {
  2. private static final long serialVersionUID = -1178522679073184111L;
  3. private String statusCode;
  4. private String message;
  5. public GlobalException() {
  6. super();
  7. }
  8. public GlobalException(GlobalStatusCode status) {
  9. super();
  10. this.statusCode = status.getStatusCode();
  11. this.message = status.getMessage();
  12. }
  13. public GlobalException(GlobalStatusCode status, String... s) {
  14. super();
  15. this.statusCode = status.getStatusCode();
  16. this.message = status.getMessage();
  17. if(s!=null){
  18. // for(String _s:s){
  19. // this.message = this.message.replace("{}",_s);
  20. // }
  21. this.message = MessageFormatter.arrayFormat(message, s).getMessage();
  22. }
  23. }
  24. public <T> GlobalException(ResultVO<T> result) {
  25. this(result.getResultCode(),result.getResultMsg());
  26. }
  27. public GlobalException(String statusCode, String message, String... s) {
  28. super();
  29. this.statusCode = statusCode;
  30. this.message = message;
  31. if(s!=null){
  32. for(String _s:s){
  33. this.message = this.message.replace("{}",_s);
  34. }
  35. }
  36. }
  37. public GlobalException(String statusCode, String message) {
  38. super();
  39. this.statusCode = statusCode;
  40. this.message = message;
  41. }
  42. public String getStatusCode() {
  43. return statusCode;
  44. }
  45. public void setStatusCode(String statusCode) {
  46. this.statusCode = statusCode;
  47. }
  48. @Override
  49. public String getMessage() {
  50. return message;
  51. }
  52. public void setMessage(String message) {
  53. this.message = message;
  54. }
  55. }

4.定义返回参数接口

  1. public interface GlobalStatusCode {
  2. /**
  3. * 获取状态码
  4. * @return
  5. */
  6. String getStatusCode();
  7. /**
  8. * 获取消息
  9. * @return
  10. */
  11. String getMessage();
  12. }

5.定义返回参数信息,实现GlobalStatusCode

  1. public enum StatusCode implements GlobalStatusCode {
  2. RESULT_SUCCESS("00000000", "SUCCESS"),
  3. RESULT_FAIL("99999999", "请求失败"),
  4. PARAM_ERROR("COUPON-00000001", "传入参数错误"),
  5. PHONE_ERROR("COUPON-00000002", "传入手机号为空"),
  6. COUPON_PARAM_ERROR("COUPON-00000003", "优惠码格式错误"),
  7. COUPON_IS_FAILURE("COUPON-00000004", "此优惠码优惠券已失效"),
  8. ACCOUNT_IS_FAIL("COUPON-00000005", "用户信息处理失败"),
  9. VERIFY_IS_FAIL("COUPON-00000006", "参数校验失败"),
  10. RCS_INFO_IS_NOT_EXIST("RCSM-00010001","无此本根服务器信息");
  11. private String statusCode;
  12. private String message;
  13. StatusCode(String statusCode, String message) {
  14. this.statusCode = statusCode;
  15. this.message = message;
  16. }
  17. @Override
  18. public String getStatusCode() {
  19. return statusCode;
  20. }
  21. @Override
  22. public String getMessage() {
  23. return message;
  24. }
  25. public void setStatusCode(String statusCode) {
  26. this.statusCode = statusCode;
  27. }
  28. public void setMessage(String message) {
  29. this.message = message;
  30. }
  31. }

6.测试controller

  1. @Api(tags = "测试" ,description = "MemberController")
  2. @RestController
  3. @RequestMapping("/test")
  4. public class MemberController {
  5. @ApiOperation(value = "全局异常处理测试测试数据")
  6. @GetMapping("/test/data")
  7. public ResultVO testData(int a ,int b){
  8. int c=a+b;
  9. if(b==0){
  10. throw new GlobalException(StatusCode.RESULT_FAIL);
  11. }
  12. if(a==1){
  13. throw new GlobalException(StatusCode.PARAM_ERROR);
  14. }
  15. if(a==2){
  16. throw new GlobalException(StatusCode.PHONE_ERROR);
  17. }
  18. if(a==3){
  19. throw new GlobalException(StatusCode.COUPON_PARAM_ERROR);
  20. }
  21. return new ResultVO(StatusCode.RESULT_SUCCESS);
  22. }

7.测试结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nc2hlbmdxaWFuZzE2OA_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,172人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot异常全局统一处理

    [个人博客][Link 1] 日常后端业务开发中,在提供接口服务时会遇到各种异常处理,通常涉及到参数校验异常、自定义异常以及一些不可预知的异常等等。下面就来说一下在sprin