У нас есть приложение, в котором мы пытаемся перейти от использования только 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>
- это поддерживаемый возврат обработчика запросов тип.