1.自定义异常

    1. public class CustomizeException extends RuntimeException {
    2. /**
    3. * 错误代码
    4. */
    5. private ComCode code;
    6. /**
    7. * 异常信息
    8. */
    9. private Exception e;
    10. public CustomizeException(ComCode code,Exception e){
    11. this.code = code;
    12. this.e = e;
    13. }
    14. public ComCode getCode() {
    15. return code;
    16. }
    17. public Exception getE() {
    18. return e;
    19. }
    20. }

    2.自定义异常处理器

    1. import com.google.common.collect.ImmutableMap;
    2. @RestControllerAdvice
    3. public class ExceptionCatch {
    4. private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
    5. /**
    6. * 定义map,配置异常类型所对应的错误代码
    7. */
    8. private static ImmutableMap<Class<? extends Throwable>, ComCode> EXCEPTIONS;
    9. /**
    10. * 定义map的builder对象,去构建ImmutableMap
    11. */
    12. protected static ImmutableMap.Builder<Class<? extends Throwable>, ComCode> builder = ImmutableMap.builder();
    13. /**
    14. * 捕获 CustomizeException 异常
    15. * @param e
    16. * @return
    17. */
    18. @ExceptionHandler(CustomizeException.class)
    19. //@ResponseBody
    20. public Result exception(HttpServletRequest request, HandlerMethod method, CustomizeException e) {
    21. LOGGER.error("{} catch exception : {}", e.getCode().message(),e.getE());
    22. ComCode code = e.getCode();
    23. Result result = new Result().setCodeAndMessage(code);
    24. return result;
    25. }
    26. /**
    27. * 参数校验统一异常处理
    28. */
    29. @ExceptionHandler(MethodArgumentNotValidException.class)
    30. public ResultVo handleBindException(MethodArgumentNotValidException e) {
    31. FieldError fieldError = e.getBindingResult().getFieldError();
    32. assert fieldError != null;
    33. log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
    34. return ResultVo.error(Objects.requireNonNull(ResultCode.getMsg(fieldError.getDefaultMessage())));
    35. }
    36. /**
    37. * 参数校验统一异常处理
    38. */
    39. @ExceptionHandler(BindException.class)
    40. public ResultVo handleBindException(BindException e) {
    41. FieldError fieldError = e.getBindingResult().getFieldError();
    42. assert fieldError != null;
    43. log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
    44. return ResultVo.error(Objects.requireNonNull(ResultCode.getMsg(fieldError.getDefaultMessage())));
    45. }
    46. /**
    47. * 捕获Exception此类异常
    48. * @param exception
    49. * @return
    50. */
    51. @ExceptionHandler(Exception.class)
    52. public Result exception(Exception exception){
    53. //记录日志
    54. LOGGER.error("catch exception:{}",exception.getMessage(),exception);
    55. if(EXCEPTIONS == null){
    56. //EXCEPTIONS构建成功
    57. EXCEPTIONS = builder.build();
    58. }
    59. //从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应服务器内部错误异常
    60. ComCode code = EXCEPTIONS.get(exception.getClass());
    61. if(code != null){
    62. return new Result().setCodeAndMessage(code);
    63. }else{
    64. //返回服务器内部错误异常
    65. return new Result().setCodeAndMessage(ResultCode.INTERNAL_SERVER_ERROR);
    66. }
    67. }
    68. static {
    69. //定义异常类型所对应的错误代码
    70. builder.put(RejectedExecutionException.class, ResultCode.REJECTED_EXECUTION);
    71. builder.put(AccessDeniedException.class, ResultCode.AUTH_ACCESS_DENIED);
    72. }
    73. }

    3.状态码接口

    1. package com.mochain.moline.common.result;
    2. public interface ComCode {
    3. Integer getCode();
    4. String getMsg();
    5. }

    4.状态码接口实现枚举

    package com.mochain.moline.common.result;
    
    public enum ResultCode implements ComCode {
        SUCCESS(0,"SUCCESS"),
        EXCEPTION(500,"EXCEPTION")
        ;
        private Integer code;
        private String msg;
    
        ResultCode(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        @Override
        public Integer getCode() {
            return code;
        }
    
        @Override
        public String getMsg() {
            return msg;
        }
    }
    

    5.通用返回值

    package com.mochain.moline.common.result;
    
    import com.mochain.moline.common.util.InternationalUtil;
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.io.Serializable;
    
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class ResultVo implements Serializable {
        private static final long serialVersionUID = -7617442560238858029L;
    
        private Integer code;
        private String msg;
        private Object data;
    
        /**
         * 系统错误
         */
        public static ResultVo error(ComCode comCode){
            ResultVo resultVo = new ResultVo();
            resultVo.setCode(comCode.getCode());
            resultVo.setMsg(comCode.getMsg());
            return resultVo;
        }
    
        /**
         * 成功
         */
        public static ResultVo ok(ComCode comCode){
            ResultVo resultVo = new ResultVo();
            resultVo.setCode(comCode.getCode());
            resultVo.setMsg(comCode.getMsg());
            return resultVo;
        }
    
        public static ResultVo ok(ComCode comCode, Object data){
            ResultVo resultVo = new ResultVo();
            resultVo.setCode(comCode.getCode());
            resultVo.setMsg(comCode.getMsg());
            resultVo.setData(data);
            return resultVo;
        }
    }