【问题标题】:Get exception object in custom error controller在自定义错误控制器中获取异常对象
【发布时间】:2019-06-15 00:37:24
【问题描述】:

我正在使用 Spring Boot 并使用 AbstractErrorController 编写一个全局异常处理程序。如何在控制器中获取异常对象?

@Controller
public class MyCustomErrorController extends AbstractErrorController {

    public MyCustomErrorController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }

    @RequestMapping("/error")
    public void handleError(HttpServletRequest req, HttpServletResponse resp) {
        Exception e = ...; // how to get exception here
        log.error(e);
        displayError(req, resp, e);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

【问题讨论】:

  • 我不明白这里的逻辑。您想从端点检索错误吗?通常,错误处理程序会捕获异常并为引发该异常的任何控制器返回错误。

标签: spring-boot


【解决方案1】:

处理程序拦截由控制器生成或重新抛出的异常。它没有端点,因为它通常为应用程序中的所有控制器执行此操作。 Handler 指示应用程序服务器在抛出特定异常时返回特定错误。

这是一个例子:

@ControllerAdvice // Specialization of @Component for classes that declare @ExceptionHandler, @InitBinder, or @ModelAttribute methods to be shared across multiple @Controller classes.
public class ResourceNotFoundExceptionHandler {

@ExceptionHandler(value = { ResourceNotFoundException.class })
public ResponseEntity<Object> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
    ApiError error = new ApiError(HttpStatus.NOT_FOUND,  ex.getLocalizedMessage(), ex);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

    ResponseEntity<Object> response = new ResponseEntity<>(error, headers, HttpStatus.NOT_FOUND);

    return response;
}
}

在此示例中,ApiError 是一个向 UI 报告错误的数据结构。这段代码的作用是拦截异常“ResourceNotFoundException”,创建相应的错误数据传输对象,设置响应HttpStatus和headers并返回错误。

你可以在这里找到一个不同的例子:https://github.com/otrebor/springbootseed-openshift/blob/master/src/main/java/com/company/example/springbootseed/core/errorhandling/handlers/

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 2019-08-17
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多