Список возврата запросов Axon с Axon Server - PullRequest
0 голосов
/ 27 мая 2020

У нас есть приложение, в котором мы пытаемся перейти от использования только Axon Framework к использованию Axon Server. У нас возникла проблема, из-за которой ответы на запросы, которые являются несколькими экземплярами одного типа, не могут быть правильно перенесены. Проблема, описанная ниже, не возникает, когда сервер не используется.

Мы отправляем запрос и ожидаем в качестве ответа список определенного типа c.

queryGateway.query(new MyQuery(...), ResponseTypes.multipleInstancesOf(MyResponse.class));

// elsewhere
@QueryHandler
public List<MyResponse> handle(MyQueryquery) {
  return List.of(new MyResponse(...));
}

При запуске без сервера работает нормально. Интересно, что MultipleInstancesResponseType#convert(Object) вызывается один раз, а параметром является экземпляр List<MyResponse>. Преобразование здесь не требуется.

При запуске с сервером MultipleInstancesResponseType#convert(Object) вызывается дважды. В первый раз, как указано выше, параметром является ожидаемый List<MyResponse>, и снова преобразование не требуется. Однако затем снова вызывается MultipleInstancesResponseType#convert(Object) с параметром List<LinkedHashMap>. Для этого требуется преобразование, которое не удается, потому что List<MyResponse> не может быть преобразовано в List<MyResponse>.

Я вижу оба вызова convert в моем отладчике, потому что в моем тесте одна и та же JVM выполняет и обрабатывает query.

Я считаю, что происходит то, что обработчик запросов возвращает List<MyResponse>, а структура вызывает MultipleInstancesResponseType#convert(Object) как обычно. Затем ответ сериализуется (gRP C?) И отправляется на сервер, который затем отправляет ответ исходному вызывающему. Затем исходный вызывающий объект пытается преобразовать полезную нагрузку и терпит неудачу. Итак, где-то в процессе сериализации / десериализации gRP C некоторая информация о типе была потеряна.

Результат net состоит в том, что исходный вызывающий объект получает IllegalArgumentException с указанием

Полученный ответ [class java .util.ArrayList] не может быть преобразован в список ожидаемого типа ответа [class MyResponse]

Установка точки останова на GrpcPayloadSerializer показывает, что ответ полезная нагрузка, на момент сериализации для отправки на сервер, правильно представляет собой List<MyResponse>.

Документация , кажется, ясно говорит, что List<of-something> - это поддерживаемый возврат обработчика запросов тип.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Оказывается, это связано с тем, что мы использовали JacksonSerializer для сообщений. Если мы изменим значение на XStreamSerializer, то все будет работать, как ожидалось.

Я полагаю, это результат того, что JSON документ, который Джексон выдает, не содержащий информации о типе, и конец десериализации не знает ожидаемого возврата запроса type.

Итак, если вы используете Axon Server, возможно, стоит использовать XStream или Java Serialization для ваших сообщений.

0 голосов
/ 28 мая 2020

Как уже выяснил @ptomli, это скорее проблема Джексона, а не Axon.

Но в дополнение к этому AxonFramework предоставил исправление для этого PR . Он еще не выпущен (я полагаю, что он будет частью выпуска 4.4), но вы можете сами взглянуть на решение, чтобы написать собственный обходной путь или дождаться упомянутого выпуска.

...