Spring Boot 3.0 上的全局异常处理程序/@ControllerAdvice 未应用

问题描述 投票:0回答:1

我最近将我的应用程序从 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
java spring-boot error-handling controller-advice
1个回答
0
投票

你看到了吗

log.error("File access Exception", fae);
...

不,没什么@xerx593

假设:

  • 您的日志记录设置正确且级别 >= 错误
  • @ControllerAdvice
    正确拾取

..这意味着:

这是

FileAccessException
(但是另一个,..设置一个断点!)

看看 ResponseEntityExceptionHandler

impl,它为“一堆”/多种类型的异常注册异常处理程序,并且是“默认”的。

通过

ProblemDetailsExceptionHandler
(web|webflux) 配置,也可以(通过继承)使用自定义实现。

要从“异常处理程序”中获得“最佳”效果(例如,考虑 application.properties),请遵循此处列出的提示(它说“反应式”,但是:potayto-potahto;):

    牢记/牢记
  • super
     实施:
    
      现有处理程序
    • 接口
    • 利用
    • 受保护方法
  • ErrorResponseException
     扩展你的“Error”类
    
© www.soinside.com 2019 - 2024. All rights reserved.