我最近将我的应用程序从 Spring Boot 2.1 迁移到 Spring Boot 3.0。 但问题是,现在有些端点在发生错误时不会给出相同的响应,而是我得到这样的结果:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Failed to convert 'id' with value: 'territory'",
"instance": "/webfront/administration/book/territory"
}
我通过添加一个从 ResponseEntityExceptionHandler 扩展的 @ControllerAdvice 类来完成此任务。
但是我需要一些其他信息,预期的信息会是这样的:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Failed to convert 'id' with value: 'territory'",
"instance": "/webfront/administration/book/territory",
"timestamp": "2023-04-15 12:02:21",
"code" : 24
}
这是我的控制器建议的实现,应该在全球范围内应用(例如,只有一个例外,但实际上有几个)。
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static ErrorResponse mapToErrorResponse(Exception e, ApplicationError applicationError, String errorMessage, HttpStatus status) {
return ErrorResponse.builder(e, status, errorMessage)
.property("code", String.valueOf(applicationError.getCode()))
.property("timestamp", Instant.now())
.build();
}
@ExceptionHandler(FileAccessException.class)
public ErrorResponse fileAccessException(FileAccessException fae) {
log.error("File access Exception", fae);
return mapToErrorResponse(fae, fae.getApplicationError(), fae.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
...
}
由于某种原因,spring 未检测到此处理程序,并且异常主体继续作为第一个示例,而没有我的自定义数据。
我还有另一个关于我的 UrlAuthenticationFailureHandler 的问题,之前当用户尝试访问未经授权的路由时,异常已被处理,现在主体始终为空。我尝试将此配置条目添加到我的 application.yml 但没有任何区别:
server:
error:
include-message: ALWAYS
include-stacktrace: ALWAYS
mvc:
problemdetails:
enabled: true
你看到了吗
...log.error("File access Exception", fae);
不,没什么@xerx593
假设:
@ControllerAdvice
正确拾取..这意味着:
这是不
FileAccessException
(但是另一个,..设置一个断点!)
看看 ResponseEntityExceptionHandler
通过
ProblemDetailsExceptionHandler
(web|webflux) 配置,也可以(通过继承)使用自定义实现。
要从“异常处理程序”中获得“最佳”效果(例如,考虑 application.properties),请遵循此处列出的提示(它说“反应式”,但是:potayto-potahto;):
super
实施:
ErrorResponseException
扩展你的“Error”类