当前位置:   article > 正文

基于SpringBoot的全局异常处理_@apimodelproperty(value = "返回标记:成功标记=0")

@apimodelproperty(value = "返回标记:成功标记=0")

目录

1、CommonReturnType.class

2、CommonError接口

3、BusinessException.class

4、枚举类EnuBusinessError 

5、BusinessExceptionHandle.class


本篇介绍后端Controller层如何返回统一的数据格式给前端。

因为涉及到异常的处理,所以制作了一个java异常的简略图,如下:

首先定义一个全局返回的类,该类定义了返回给前端的统一格式:状态码+返回数据,具体代码实现如下:

1、CommonReturnType.class

  1. public class CommonReturnType {
  2. /**
  3. * 返回数据
  4. */
  5. private String status;
  6. /**
  7. * 返回状态码
  8. */
  9. private Object data;
  10. public static CommonReturnType create(String status,Object data){
  11. CommonReturnType type = new CommonReturnType();
  12. type.setStatus(status);
  13. type.setData(data);
  14. return type;
  15. }
  16. public static CommonReturnType create(Object data){
  17. return CommonReturnType.create("success",data);
  18. }
  19. public String getStatus() {
  20. return status;
  21. }
  22. public void setStatus(String status) {
  23. this.status = status;
  24. }
  25. public Object getData() {
  26. return data;
  27. }
  28. public void setData(Object data) {
  29. this.data = data;
  30. }
  31. }

以上全局返回参数只适应于程序没有错误和异常的情况,所以针对错误和异常,我们需要另外再定义其他类来实现,首先定义一个公共错误的接口,接口中需要有获取错误码(errorCode)和错误信息(errorMessage)的方法,另外还需要设计一个设置错误信息的方法,以便我们能自定义异常,代码实现如下:

2、CommonError接口

  1. public interface CommonError {
  2. public Integer getErrorCode();
  3. public String getErrorMsg();
  4. public CommonError setErrorMsg(String errorMsg);
  5. }

然后对于异常的处理,我们需要定义自己能够及时判断错误的信息,准确的明确和找到程序错误,因此我们需要自定义自己的异常类,代码如下:

3、BusinessException.class

  1. public class BusinessException extends RuntimeException implements CommonError{
  2. private CommonError commonError;
  3. public BusinessException(CommonError commonError){
  4. super();
  5. this.commonError = commonError;
  6. }
  7. public BusinessException(CommonError commonError,String errorMsg){
  8. super();
  9. this.commonError = commonError;
  10. // 对errorMsg进行二次修改
  11. this.commonError.setErrorMsg(errorMsg);
  12. }
  13. @Override
  14. public Integer getErrorCode() {
  15. return this.commonError.getErrorCode();
  16. }
  17. @Override
  18. public String getErrorMsg() {
  19. return this.commonError.getErrorMsg();
  20. }
  21. @Override
  22. public CommonError setErrorMsg(String errorMsg) {
  23. this.commonError.setErrorMsg(errorMsg);
  24. return this;
  25. }
  26. }

对于错误信息,随着程序代码的不断增加,我们希望能够把错误信息进行归类整理,以便后期能够方便进行维护和拓展,因此,我们使用枚举类来进行定义,定义格式跟公共错误接口的格式保持一致:错误码+错误信息;代码实现如下:

4、枚举类EnuBusinessError 

  1. public enum EnuBusinessError implements CommonError{
  2. // 定义一个通用错误类型
  3. PARAMETER_VILIDATION_ERROR(10000,"参数不合法"),
  4. // 定义未知错误
  5. NUKNOW_ERROR(10002,"未知错误"),
  6. ;
  7. private Integer errorCode;
  8. private String errorMsg;
  9. private EnuBusinessError(Integer errorCode,String errorMsg){
  10. this.errorCode = errorCode;
  11. this.errorMsg = errorMsg;
  12. };
  13. @Override
  14. public Integer getErrorCode() {
  15. return this.errorCode;
  16. }
  17. @Override
  18. public String getErrorMsg() {
  19. return this.errorMsg;
  20. }
  21. @Override
  22. public CommonError setErrorMsg(String errorMsg) {
  23. this.errorMsg = errorMsg;
  24. return this;
  25. }
  26. }

最后,也是最关键的一步,我们要成功捕获控制层(Controller)程序中的异常信息,并把异常信息转化为我们自己定义的信息,我们需要借助Spring中的相关注解

@ControllerAdvice 控制器增强,被该注解标记的类可以作用于全局的Controller上

@ExceptionHandler Controller层异常处理和捕获

5、BusinessExceptionHandle.class

  1. @ControllerAdvice //使用该注解捕获全局异常
  2. public class BusinessExceptionHandle {
  3. @ExceptionHandler(RuntimeException.class)
  4. @ResponseBody
  5. @ResponseStatus(HttpStatus.OK)// 自定义异常响应对应的状态码,碰到了某个自定义异常加上了@ResponseStatus,
  6. // 就继续抛出,这样就不会让自定义异常失去加上@ResponseStatus的初衷
  7. public CommonReturnType BusinessExceptionHandle(Exception e){
  8. Map<String,Object> resultMap = new HashMap<>();
  9. if(e instanceof BusinessException){
  10. BusinessException ex = (BusinessException) e;
  11. resultMap.put("errorCode",ex.getErrorCode());
  12. resultMap.put("errorMsg",ex.getErrorMsg());
  13. }else{
  14. resultMap.put("errorCode",EnuBusinessError.NUKNOW_ERROR.getErrorCode());
  15. resultMap.put("errorMsg",EnuBusinessError.NUKNOW_ERROR.getErrorMsg());
  16. }
  17. return CommonReturnType.create(resultMap);
  18. }
  19. }

综合上述,代码使用效果如下图所示:

补充实例代码

  1. import com.x.x.common.core.constant.CommonConstants;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.*;
  5. import lombok.experimental.Accessors;
  6. import java.io.Serializable;
  7. /**
  8. * 响应信息主体
  9. */
  10. @Builder // 自动生成 builder() 方法,并且直接根据字段名称方法进行字段赋值,最后使用 build()方法构建出一个实体对象。
  11. @ToString // 给类自动生成 toString 方法,带上有所非静态字段的属性名称和值
  12. @NoArgsConstructor // 为实体类生成无参的构造器方法
  13. @AllArgsConstructor // 为实体类生成除了static修饰的字段之外带有各参数的构造器方法
  14. @Accessors(chain = true) // 每次使用set方法返回的都是对象本身
  15. @ApiModel(value = "响应信息主体")
  16. public class CommonResponse<T> implements Serializable {
  17. private static final long serialVersionUID = 1L;
  18. @Getter // 生成getter方法
  19. @Setter // 生成setter方法
  20. @ApiModelProperty(value = "返回标记:成功标记=0,失败标记=1")
  21. private int code;
  22. @Getter
  23. @Setter
  24. @ApiModelProperty(value = "返回信息")
  25. private String msg;
  26. @Getter
  27. @Setter
  28. @ApiModelProperty(value = "数据")
  29. private T data;
  30. public static <T> CommonResponse<T> ok() {
  31. return restResult(null, CommonConstants.SUCCESS, null);
  32. }
  33. public static <T> CommonResponse<T> ok(T data) {
  34. return restResult(data, CommonConstants.SUCCESS, null);
  35. }
  36. public static <T> CommonResponse<T> ok(T data, String msg) {
  37. return restResult(data, CommonConstants.SUCCESS, msg);
  38. }
  39. public static <T> CommonResponse<T> failed() {
  40. return restResult(null, CommonConstants.FAIL, null);
  41. }
  42. public static <T> CommonResponse<T> failed(String msg) {
  43. return restResult(null, CommonConstants.FAIL, msg);
  44. }
  45. public static <T> CommonResponse<T> failed(T data) {
  46. return restResult(data, CommonConstants.FAIL, null);
  47. }
  48. public static <T> CommonResponse<T> failed(T data, String msg) {
  49. return restResult(data, CommonConstants.FAIL, msg);
  50. }
  51. private static <T> CommonResponse<T> restResult(T data, int code, String msg) {
  52. CommonResponse<T> apiResult = new CommonResponse<>();
  53. apiResult.setCode(code);
  54. apiResult.setData(data);
  55. apiResult.setMsg(msg);
  56. return apiResult;
  57. }
  58. }

参考链接:实体类测试技巧:@Accessors注解的使用_QR_adaptor的博客-CSDN博客_accessors注解

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号