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

时间:2018-01-23 12:38:29

标签: java spring spring-boot sentry

我有一个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, following the documentation时:

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我将这两个注释添加到RestExceptionHandler

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

@Priority(1)
@Order(1)

我添加两者的原因是因为显然订单是非确定性的,我不能再现问题。由于我添加了这两个注释,它没有再次发生,但由于非确定性,我不知道我是否解决了这个问题。

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

答案 2 :(得分:0)

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

sentry:
    exception-resolver-order: 2

在你的课堂上:

import org.springframework.core.annotation.Order;

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