Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Axon服务器返回Axon查询列表_Java_Axon - Fatal编程技术网

Java 使用Axon服务器返回Axon查询列表

Java 使用Axon服务器返回Axon查询列表,java,axon,Java,Axon,我们有一个应用程序,试图从仅使用Axon框架转向同时使用Axon服务器。我们遇到了一个问题,查询响应是一种类型的多个实例,无法正确传输。未使用服务器时,不会出现下面详述的问题 我们正在发送一个查询,并期望一个特定类型的列表作为响应 queryGateway.query(new MyQuery(...), ResponseTypes.multipleInstancesOf(MyResponse.class)); // elsewhere @QueryHandler public List<

我们有一个应用程序,试图从仅使用Axon框架转向同时使用Axon服务器。我们遇到了一个问题,查询响应是一种类型的多个实例,无法正确传输。未使用服务器时,不会出现下面详述的问题

我们正在发送一个查询,并期望一个特定类型的列表作为响应

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

// elsewhere
@QueryHandler
public List<MyResponse> handle(MyQueryquery) {
  return List.of(new MyResponse(...));
}
在不使用服务器的情况下运行时,这可以正常工作。有趣的是,MultipleInstancesResponseTypeconvertObject只调用一次,参数是List实例。这里不需要转换

当与服务器一起运行时,将调用两次MultipleInstancesResponseTypeconvertObject。第一次,如上所述,参数是预期列表,同样,不需要转换。但是,随后再次调用MultipleInstancesResponseTypeconvertObject,参数为List。这需要转换,但转换失败,因为无法将列表转换为列表

我在调试器中看到这两个convert调用,因为在我的测试中,同一个JVM正在生成和处理查询

我相信现在的情况是,查询处理程序正在返回列表,框架正在按照正常方式调用MultipleInstancesResponseTypeconvertObject。然后将响应序列化为gRPC?并发送到服务器,然后服务器将响应发送给原始调用方。然后,原始调用方尝试转换有效负载,但失败。因此,在gRPC序列化/反序列化过程的某个地方,一些类型信息丢失了

最终结果是原始调用者得到一个IllegalArgumentException语句

检索到的响应[class java.util.ArrayList]无法转换为预期响应类型[class MyResponse]的列表

在GrpcPayloadSerializer上设置断点表明响应负载在序列化以发送到服务器时是正确的列表


列表似乎清楚地表明,它是一种受支持的查询处理程序返回类型。

结果表明,这是由于我们对消息使用了JacksonSerializer。如果我们改为XStreamSerializer,那么一切都会按预期工作

我猜想这是Jackson生成的JSON文档不包含类型信息的结果,反序列化端不知道预期的查询返回类型


因此,如果您使用的是Axon服务器,那么在消息中使用XStream或Java序列化可能是一个好主意。

正如@ptomli已经发现的,这更像是Jackson的问题,而不是Axon的问题


但除此之外,AxonFramework还提供了一个解决方案。它还没有发布,我相信它将是4.4版本的一部分,但您可以自己看看解决方案,编写自己的解决方案,或者等待提到的版本。

更进一步,AxonFramework提供了一个解决方案。它还没有发布,我相信它将成为4.4版本的一部分,但是你可以自己看看解决方案。@LucasCampos谢谢你,它真的很有帮助。如果你把它写下来作为一个答案,我会接受它,因为它实际上解决了比我设法发现的更多的潜在问题。我在这些行上添加了一些东西作为回应。