感谢您的回复。
不可能说“不接听提供商”
你是对的。我没有用正确的词语来描述发生的事情。侦听器处于活动状态,但由于某种原因,异常传播无法按我的预期工作。
我现在无法提供项目示例,但我会尝试用代码示例来展示正在发生的事情:
这是我的执行侦听器:
@Slf4j
public class ApplicationExceptionTranslator extends DefaultExecuteListener {
@Override
public void exception(ExecuteContext ctx) {
System.out.println("DEFAULT EXECUTION LISTENER ..............................");
if (ctx.sqlException() != null) {
// PRINT SOME STAFF
log.warn("SQL: {}", ctx.sql());
log.warn("RUNTIME EXC MESSAGE: {}", ctx.exception().getMessage());
log.warn("RUNTIME EXC CANNONICAL NAME: {}", ctx.exception().getClass().getCanonicalName());
SQLDialect dialect = ctx.dialect();
SQLExceptionTranslator translator = (dialect != null)
? new SQLErrorCodeSQLExceptionTranslator(dialect.thirdParty().springDbName())
: new SQLStateSQLExceptionTranslator();
DataAccessException daoEx = translator.translate("jOOQ", ctx.sql(), ctx.sqlException());
ApplicationRepositoryException appRepositoryException = // create EXCEPTION from ctx and daoEx
ctx.exception(appRepositoryException);
}
}
}
这是我的其余异常处理程序,其中包含应用程序异常和 spring dao 异常的处理程序(出于调试目的添加了 spring 异常):
@ControllerAdvice
@Slf4j
public class ApplicationRestResponseExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ApplicationRepositoryException.class)
protected ResponseEntity<ApplicationRestError> handleApplicationRepositoryException(ApplicationRepositoryException ex, HttpServletRequest req) {
HttpStatus status = HttpStatus.CONFLICT;
ApplicationRestError body = MessageBuilder.buildApplicationRestError(ex, req, status);
return new ResponseEntity<>(body, status);
}
@ExceptionHandler(DataAccessException.class)
protected ResponseEntity<ApplicationRestError> handleSpringDataAccessException(DataAccessException ex, HttpServletRequest req) {
HttpStatus status = HttpStatus.CONFLICT;
ApplicationRestError body = MessageBuilder.buildApplicationRestError(ex, req, status);
return new ResponseEntity<>(body, status);
}
}
我尝试设置 bean 的顺序:
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public DefaultExecuteListenerProvider applicationExceptionTranslatorExecuteListenerProvider() {
return new DefaultExecuteListenerProvider(new ApplicationExceptionTranslator());
}
我禁用了 BeanPostProcessor 的配置。
上述配置的结果是其余异常处理程序捕获 DataAccessException.class 而不是 ApplicationRepositoryException.class。
当我启用 BeanPostProcessor(如我的第一篇文章中所示)时,我的其余异常处理程序捕获 ApplicationRepositoryException.class。这对我来说是预期的行为,我只想处理应用程序异常。
另一件事:我在这两种情况下都看到日志语句。这确认监听器已加载。
谢谢