봄 부팅 통일 예외 관리

머리말

종종 여러 가지 예외가있을 것입니다, 이러한 기형이 통합 처리를 다루는 문제가 될 어떻게, 봄 부팅 예외 처리 메커니즘의 다양한 지원, 오늘 우리는 매일 개발 메커니즘을 처리하는 일반적인 통합 예외에 대한 간단한 모양을 가지고있다.

@ControllerAdvice방법

이용함으로써 @ControllerAdvice@ExceptionHandler각각 개별적 컨트롤러 정의보다는 균일 예외 처리 클래스를 정의한다.

이상 HTML
일관된 예외 처리 컨트롤러 정의
@ControllerAdvice
class GlobalExceptionHandler {

    public static final String DEFAULT_ERROR_VIEW = "error";

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        return mav;
    }
}
复制代码
일관된 예외 처리 페이지를 정의
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>统一异常处理</title>
</head>
<body>
    <h1>Error Handler</h1>
    <div th:text="${url}"></div>
    <div th:text="${exception.message}"></div>
</body>
</html>
复制代码
이상 JSON
이상 반응의 JSON 정의 조화
@Data
public class ErrorResult<T> {
	private Integer code;
    private String message;
    private String url;
    private T data;
}
复制代码
일관된 예외 처리 컨트롤러 정의
@ControllerAdvice
public class GlobalExceptionHandler {
    //捕获自定义业务异常
    @ExceptionHandler(value = BizException.class)
    @ResponseBody
    public ErrorResult<Object> jsonErrorHandler(HttpServletRequest req,BizException e) throws Exception {
        ErrorResult<Object> r = new ErrorResult<>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setUrl(req.getRequestURL().toString());
        return r;
    }
}
复制代码

2. BasicErrorController방법

이 계획으로, 인터페이스는 요청이 자신없는 경우 HTML또는RESTful API

정의 예외 핸들러 유니폼
@Controller
@RequestMapping("/error")
public class GlobalErrorController extends BasicErrorController {

    @Autowired
    public GlobalErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties) {
        super(errorAttributes, serverProperties.getError());
    }

    @RequestMapping(produces = "text/html")
    @Override
    public ModelAndView errorHtml(HttpServletRequest request,
                                  HttpServletResponse response) {
        return super.errorHtml(request, response);
    }

    @RequestMapping
    @ResponseBody
    @Override
    @SuppressWarnings("unchecked")
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = super.getErrorAttributes(request,
                isIncludeStackTrace(request, MediaType.ALL));

        String message = body.get("message") != null ? (String) body.get("message") : null;
        Integer statusCode = body.get("status") != null ? (Integer) body.get("status") : null;

        Object exception = body.get("exception");
        if (exception instanceof TradeBizException) {
            TradeBizException bre = (TradeBizException) exception;
            statusCode = bre.getCode();
        }

        Wrapper<Object> wrap = WrapMapper.wrap(statusCode == 0 ? Wrapper.ERROR_CODE : statusCode, message);
        Map res = null;
        try {
            ObjectMapper mapper = new ObjectMapper();
            String s = mapper.writeValueAsString(wrap);
            res = mapper.readValue(s, Map.class);
        } catch (IOException e) {
            e.printStackTrace();
        }

        HttpStatus status = super.getStatus(request);
        return new ResponseEntity<Map<String, Object>>(res, status);
    }
}
复制代码

참조 기사

통합 예외 관리

웹 애플리케이션에서 봄 부팅 통일 예외 처리

추천

출처juejin.im/post/5e5b851af265da570e39a6e7