【发布时间】:2016-03-25 19:58:44
【问题描述】:
我设置了以下控制器建议,以针对错误条件返回 API 合同:
@ControllerAdvice
public class ExceptionHandler : ResponseEntityExceptionHandler()
{
@ExceptionHandler(Throwable::class)
@ResponseBody
public fun onException(ex: Throwable): ResponseEntity<ErrorResponse>
{
val errorResponse = ErrorResponse(
response = ResponseHeader(ex.responseCode(), ex.message))
return ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED);
}
}
它 工作正常,然后停止工作。现在所有异常都被路由到BasicErrorController,它返回如下格式:
{
"timestamp" : 1450495303166,
"status" : 403,
"error" : "Forbidden",
"message" : "Access Denied",
"path" : "/profile/candidates"
}
以上是一个很好的固执己见的起点,但现在它不会妨碍你。
- 我尝试用
ExceptionHandlerExceptionResolver的一个实例替换错误处理程序,但没有奏效。 - 我尝试过制作自己的CustomErrorHandler,但这也不合适,因为当它重新路由到自定义错误控制器时,
HttpServletRequest中不再存在原始异常。需要此信息才能向客户端返回适当的响应。
我该怎么做:
- 使 SpringBoot不 将异常转发到异常控制器。
- 恢复@ControllerAdvice 异常处理程序,这样我就可以返回适当的响应正文和状态代码。
关于启动 spring 日志:
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
编辑:
在阅读了 Spring Boot 文档之后,我现在明白 BasicErrorController 应该只针对@ControllerAdvice 处理的任何异常触发。这似乎没有发生。那么问题是为什么?
【问题讨论】:
标签: java spring spring-mvc spring-boot kotlin