Я видел много сообщений и вопросов и ответов на StackOverflow для пользовательской обработки ошибок для приложений REST / MVC.
Моя ситуация немного отличается. Мое приложение использует Java обмен сообщениями (с ActiveMQ и SpringIntegration), и приведенный ниже метод запускается как ответ на JMessage:
public BenefitVersion getVersionAt(LocalDate referenceDate) {
return versions.stream()
.filter(benefitVersion -> !benefitVersion.getStartDate().isAfter(referenceDate))
.reduce(maxBy(getBenefitVersionStartDateComparator()
.thenComparingLong(BenefitVersion::getId)))
.orElseThrow(() -> new IllegalBenefitVersionException(guid,
format("Benefit %s does not have active version on %s", guid, referenceDate)));
}
Я определил настраиваемое исключение, как показано ниже:
public class IllegalBenefitVersionException extends RuntimeException {
private UUID benefitId;
public IllegalBenefitVersionException(final UUID benefitId, final String message) {
super(message);
this.benefitId = benefitId;
}
}
И специальный обработчик для этого исключения:
@ControllerAdvice
public class IllegalBenefitVersionExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(IllegalBenefitVersionExceptionHandler.class);
private final DlqExceptionDetailService exceptionDetailService;
@Autowired
public IllegalBenefitVersionExceptionHandler(DlqExceptionDetailService exceptionDetailService) {
this.exceptionDetailService = exceptionDetailService;
}
@ExceptionHandler(IllegalBenefitVersionException.class)
public void handleException(Throwable t) {
IllegalBenefitVersionException exception = (IllegalBenefitVersionException) t;
exceptionDetailService.newWithBenefitIdAndSave(exception.getBenefitId(), t.getMessage());
LOGGER.error("From ExceptionHandler: {}", t.getMessage(), t);
}
}
Но он никогда не вызывается. Причина в том, что я использую @ControllerAdvice
, а контроллера нет?
Или, возможно, мне нужно где-то добавить специальное сканирование компонентов?
Если да, как мне подключить пользовательский обработчик исключений к приложению, основанному на обмене сообщениями, а не REST?