[英]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_VALUE
: https : //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.