Проблемы с использованием Исключения, брошенного в Axon @QueryHandler, который аннотируется как Spring @ResponseStatus.Исходное Исключение проглатывается QueryHandler и Axon-специфичным AxonServerRemoteQueryHandlingException, которое фактически выдает 500, когда весна отвечает клиенту
Все еще возможно собрать некоторую информацию из исключения Axon, например, оригинальное сообщение «Entity not found»но не тип исключения и не любая другая информация, которую содержит исходное исключение.
Q1: есть ли способ повысить исключение, выброшенное в обработчике запросов, в ответ Spring как 404
обработчик исключений Spring
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NotFoundException extends ServiceException() {
...
}
Обработчик запросов Axon
@QueryHandler
public Application getApplicationById(ApplicationByIdQuery query) {
return applicationRepository.findById(query.getId())
.orElseThrow(() -> new NotFoundException(Application.class, query.getId()));
}
Пружинный контроллер
@Autowired
QueryGateway queryGateway;
@GetMapping(path = "/{applicationId}")
public CompletableFuture<Application> getApplication(@PathVariable String applicationId) {
return queryGateway.query(new ApplicationByIdQuery(applicationId), ResponseTypes.instanceOf(Application.class));
}
Фактический результат json:
{
"timestamp": "2019-02-08T08:04:03.629+0000",
"status": 500,
"error": "Internal Server Error",
"message": "An exception was thrown by the remote message handling component.",
"path": "/api/applications/dff59c46-baf1-40f5-8a21-9286d1f8e36fx"
}
Q2: Мой другой вопросВот почему не следует использовать обычный API запросов JPA напрямую, а использовать QueryHandler от Axon.Таблицы проекций являются обычными таблицами JPA и могут подвергаться сомнению с помощью очень мощного Spring JPA.Это связано с тем, что прямые запросы не обеспечивают согласованность данных проекции?Я просмотрел множество примеров, большинство из которых используют прямой доступ (см. Ниже), остальные не решают исключения, возникающие из-за использования QueryHandler
@Autowired
ApplicationRepository applicationRepository;
public CompletableFuture<Application> getApplication(@PathVariable String applicationId) {
return CompletableFuture.supplyAsync(() -> applicationRepository.findById(applicationId)
.orElseThrow(() -> new NotFoundException(Application.class, applicationId)));
}