繁体   English   中英

如何在 Spring 应用程序中的 Sentry 之前拥有自己的错误处理程序?

[英]How to have my own error handlers before Sentry in a Spring application?

我有一个 Spring Boot 应用程序,我刚刚添加了 Sentry 来报告和跟踪错误。 我遇到的问题是,我在应用程序中处理了某些并非错误条件的异常。 例如,我是一个带有@Valid注释参数的操作:

@RestController
@RequestMapping("/v1/current-account")
public class CurrentAccountController extends Controller {
    @PutMapping
    public ResponseEntity<?> updateAccount(@RequestBody @Valid Account account, Authentication auth) {
    ...

当帐户无效时,它会引发MethodArgumentNotValidException 由于其他类似的情况,我有一个如下所示的异常处理程序:

@ControllerAdvice
public class RestExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleValidationError(MethodArgumentNotValidException ex, HttpServletRequest request) {
        // ...
    }

    @ExceptionHandler(NotFoundException.class)
    public ResponseEntity<?> handleNotFoundException(NotFoundException ex, HttpServletRequest request) {
        // ...
    }

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<?> handleValidationError(BadRequestException ex, HttpServletRequest request) {
        // ...
    }
}

这基本上将一些异常转换为不是错误的响应。

当我添加Sentry 时,请遵循文档

@Configuration
public class FactoryBeanAppConfig {
    @Bean
    public HandlerExceptionResolver sentryExceptionResolver() {
        return new SentryExceptionResolver();
    }

    @Bean
    public ServletContextInitializer sentryServletContextInitializer() {
        return new SentryServletContextInitializer();
    }
}

我的自定义异常处理程序不再使用。 相反,异常会报告给 Sentry。

如何让我的异常处理程序在 Sentry 之前发生?

您可以将SentryExceptionResolver子类SentryExceptionResolver以将订单号更改为比您的自定义处理程序的顺序高 1,现在它设置为MIN_VALUEhttps : //github.com/getsentry/sentry-java/blob/c856b762047fe00115000a8d76b027e5157sentry-spring /src/main/java/io/sentry/spring/SentryExceptionResolver.java#L30-L34

或者,您可以尝试使用 Sentry 日志记录集成(log4j 或 logback)而不是 Spring 集成。 这将允许您报告任何进入 ERROR 级别记录器的内容(例如)。 这是否比通过 Spring 本身更简单/更好的集成完全取决于您。

我在RestExceptionHandler添加了这两个注释:

import org.springframework.core.annotation.Order;
import javax.annotation.Priority;

@Priority(1)
@Order(1)

我添加两者的原因是因为显然顺序是不确定的,我无法重现该问题。 由于我添加了这两个注释,因此没有再次发生,但由于不确定性,我不知道我是否解决了问题。

如果它再次出现,我会回来更新这个答案。 我还想知道这两个注释中的哪一个具有预期的效果,但我现在无法正确测试。

使用最新版本,您可以更改解析器的优先级。 只需确保您自己的异常处理程序的优先级高于您为 sentry 的解析程序设置的优先级。 例如:

sentry:
    exception-resolver-order: 2

在你的课堂上:

import org.springframework.core.annotation.Order;

@RestControllerAdvice
@Order(1)
public class CustomExceptionHandler {
  // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM