我设置了以下控制器建议,以返回错误条件的API合同:
@ControllerAdvice public class ExceptionHandler : ResponseEntityExceptionHandler() { @ExceptionHandler(Throwable::class) @ResponseBody public fun onException(ex: Throwable): ResponseEntity{ 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异常处理程序,这样我就可以返回一个合适的响应体和状态代码.
在启动弹簧日志:
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
编辑:
在阅读了Spring Boot文档之后,我现在认为BasicErrorController只应该针对任何未被a处理的异常触发@ControllerAdvice
.这似乎没有发生.所以问题是为什么?