Команда Axon Server не содержит ключа маршрутизации

Я пытаюсь перенести свое приложение на Axon 4.0 с сервером Axon. Вот мой код.

data class CreateTravelProductCommand(
    @TargetAggregateIdentifier val id: String,
    val productCreator: String
)

val id: String = ObjectId.get().toString()
val command = CreateTravelProductCommand(id=id, productCreator=request.creator)
commandGateway.sendAndWait(command)

Но я получил эту ошибку с моей командой.

Редактировать:

Я только что узнал, что если вы сохраните класс в одном проекте, ничего страшного.

Проблема заключается в том, что вы импортируете класс из другого проекта (который раньше работал до сервера аксонов)

Например:

У моего проекта есть зависимости от другого проекта под названием api.

Если класс объявлен в проекте api, серверная библиотека axon выдаст ошибку, что не может найти ключ маршрутизации. Но если класс сам объявлен в основном проекте, он работает должным образом. Думаю, мне стоит отправить эту проблему на github.

dependencies {
    compile project(':api')
}

Настоящая проблема заключается в несовпадении версий двух проектов. Мне пришлось исправить версию, но автозагрузчик intellij не работал, а у проекта api была неправильная версия.


person Bads    schedule 15.11.2018    source источник


Ответы (3)


Прошу прощения за свою глупость

Та же проблема возникла при переходе с Axon 3.x на 4.0. Решение было связано с _1_ - мне не хватало его в команде CreateXXXCommand, которая обрабатывалась моим агрегатом. Я почти уверен, что добавление _2_ не было необходимо для команд создания (поскольку ему не нужно находить существующий агрегат) в Axon 3.x

person Bads    schedule 16.11.2018

На момент написания руководство по миграции было неполным https://docs.axoniq.io/reference-guide/3-migration/migration-guide.

На самом деле это больше связано с Kotlin, чем с Axon. Axon ожидает их с помощью метода Field или Getter. По-видимому, Котлин ставит их по умолчанию не туда.

person jorrocks    schedule 19.12.2018

Ознакомьтесь с https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets

Вероятно, вам нужно пометить свойство с помощью @get:TargetAggregateIdentifier

org.axonframework.commandhandling.distributed.CommandDispatchException: команда [com.sunday.api.product.CreateTravelProductCommand] не содержит ключа маршрутизации. на org.axonframework.commandhandling.distributed.AbstractRoutingStrategy.getRoutingKey (AbstractRoutingStrategy.java:57) ~ [axon-messaging-4.0.jar: 4.0] на org.axonframework.axonserver.connector.command.AxonServerServerCommandBus.dis 114) ~ [axon-server-connector-4.0.jar: 4.0] в org.axonframework.commandhandling.gateway.AbstractCommandGateway.send (AbstractCommandGateway.java:75) [axon-messaging-4.0.jar: 4.0] в org.axonframework .commandhandling.gateway.DefaultCommandGateway.send (DefaultCommandGateway.java:78) [axon-messaging-4.0.jar: 4.0] в org.axonframework.com 4.0.jar: 4.0] в com.sunday.underwriting.product.ProductHandler.sendCreateProductCommand (ProductHandler.kt: 40) [classes /: na] в com.sunday.underwriting.product.ProductHandler.access $ sendCreateProductCommand (ProductHandler. 33) [классы /: na] в com.sunday.underwriting.product.ProductHandler $ createProduct $ product $ 1.invoke (ProductHandler.kt: 97) [classes /: na] в com.sunday.underwriting.product.ProductHandler $ createProduct $ product $ 1.invoke (ProductHandler. kt: 33) [classes /: na] в com.sunday.underwriting.product.ProductHandler $ sam $ java_util_function_Function $ 0.apply (ProductHandler.kt) [classes /: na] в response.core.publisher.FluxMap $ MapSubscriber.onNext (FluxMap.java:100) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxOnErrorResume $ ResumeSubscriber.onNext (FluxOnErrorResume.java:73) [response-core- 3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1476) [response-core-3.2.2.RELEASE.jar: 3.2.2. RELEASE] в response.core.publisher.MonoSingle $ SingleSubscriber.onComplete (MonoSingle.java:171) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] на сайте response.core.publisher.FluxMap $ MapSubscriber. . onComplete (FluxMap.java:136) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxFlatMap $ FlatMapMain.checkTerminated (FluxFlatMap.java:794) [core-core -3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxFlatMap $ FlatMapMain.drainLoop (FluxFlatMap.java:560) [реактор-ядро-3. 2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxFlatMap $ FlatMapMain.drain (FluxFlatMap.java:540) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxFlatMap $ FlatMapMain.onComplete (FluxFlatMap.java:426) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.DrainUtils.postCompleteDrain (DrainUtils .java: 131) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.DrainUtils.postComplete (DrainUtils.java:186) [response-core-3.2.2. RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxMapSignal $ FluxMapSignalSubscriber.onComplete (FluxMapSignal.java:213) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] на реакторе .core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxPeek $ PeekSubscriber.onComplete (FluxPeek .java: 252) [реактор-ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) [response-core-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в response.netty.channel.FluxReceive.terminateReceiver (FluxReceive .java: 378) [response-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] в response.netty.channel.FluxReceive.drainReceiver (FluxReceive.java:202) [response-netty-0.8.2. RELEASE.jar: 0.8.2.RELEASE] в response.netty.channel.FluxReceive.onInboundComplete (FluxReceive.java:343) [Reaction-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] в response.netty .channel.ChannelOperations.onInboundComplete (ChannelOperations.java:325) [response-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] на response.netty.http.server.HttpServerOperations.onInboundNext (HttpServerOperations.java:442 ) [response-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] в response.netty.channel.ChannelOperationsHandler.channelRead (ChannelOperationsHandler.java:141) [response-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] на io.ne tty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29. [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [netty-transport-4.1.29.Final.jar: 4.1 .29. Финал] на response.netty.http.server.HttpTrafficHandler.channelRead (HttpTrafficHandler.java:188) [response-netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] на io.netty.channel.AbstractChannelHandlerContext.ReadlerChannelHandlerContext.invokeChannelHandlerContext.invokeChannel (AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [netty-transport-4.1. 29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io .netty.channel.CombinedChannelDuplexHandler $ DelegatingChannelHandlerContext.fireChannelRead (CombinedChannelDuplexHandler.java:438) [netty-transport-4.1.29. .java: 310) [netty-codec-4.1.29.Final.jar: 4.1.29.Final] в io.netty.handler.codec.ByteToMessageDecoder.channelRead (ByteToMessageDecoder.java:284) [netty-codec-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.CombinedChannelDuplexHandlerDunnel .java: 253) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29. Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] на io.netty .channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead: (Default ) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerC ontext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandler -Context: netty-transport -Context: netty -transport -Context) [netty-transport-4.1.29. -4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.DefaultChannelPipeline.fireChannelRead (DefaultChannelPipeline.java:965) [netty-transport-4.1.29.Final.jar: 4.1.29.Final ] в io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read (AbstractNioByteChannel.java:163) [netty-transport-4. 1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.processSelectedKey (NioEventLoop.java:628) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized (NioEventLoop.java:563) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.processSelectedKeys (NioEventLoop.java:480) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.run (NioEventLoop.java:442) [netty-transport- 4.1.29.Final.jar: 4.1.29.Final] в io.netty.util.concurrent.SingleThreadEventExecutor $ 5.run (SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar: 4.1.29 .Final] в java.lang.Thread.run (Thread.java:748) [na: 1.8.0_172]

person Allard    schedule 15.11.2018