Аксон @QueryHandler с весны @ExceptionHandler - PullRequest
0 голосов
/ 08 февраля 2019

Проблемы с использованием Исключения, брошенного в 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)));   
}

1 Ответ

0 голосов
/ 11 февраля 2019

Я надеюсь, что смогу помочь с некоторыми предложениями в этом пространстве.

Ответ на вопрос 1:

Сервер Axon всегда будет переносить команду, событие или запросдиспетчеризация / обработка исключений во что-то еще.

Таким образом, если вы хотите условно реагировать на исключение удаленной обработки запросов, я думаю, вам придется добавить аннотированную функцию @ExceptionHandler(AxonServerRemoteQueryHandlingException.class) в ваш код.AxonServerRemoteQueryHandlingException содержит больше информации об исключении, которое оно переносит, таким образом предоставляя вам дескриптор для отправки определенного ответа, если это необходимо.

Однако формат упакованного исключения пока не идеален.Начиная с Axon Framework / Server 4.1, в планах также будут присутствовать классы в исключении.Это упростит вам более точный контроль при обработке исключения.

Ответ на вопрос 2:

Идея использования выделенных сообщений и обработчиков запросов заключается в том, чтоВы можете отделить сторону, которая интересуется некоторыми данными, от того, как вы реализуете, предоставляя ответ.

Прежде чем предлагать выделенное решение QueryBus и @QueryHandler в рамках, вы предлагаете единственный вариант, который у вас есть.Понятие использования выделенного сообщения запроса для этого, однако, позволяет вам иметь полностью отдельную (микро) службу, отвечающую на ваш запрос, без необходимости для отправителя запроса знать, где находится эта служба.

Использование запросов и запросовОбработчики в приложении Axon - это один из столпов, который предоставляет вам Location Transparency '.Вы совершенно свободны в том, чтобы не использовать логику запросов, предоставляемую платформой, но я лично считаю, что это отличный инструмент для эволюционных микросервисов.

Надеюсь, это поможет вам, Томаш!

...