v3 M5 : IllegalArgumentException when using Sagas in a spring app with in memory building blocks

Hello,

i’m currently migrating my Axon2 pet project to Axon3 M5 and have been facing issues with Sagas.

i’m using spring and the @EnableAxon annotation in a pretty basic configuration:

`

@EnableAxon
@Configuration
public class AxonFrameworkConfiguration {

    @Bean(name = "eventBus")
    EventStore eventStore() {
        return new EmbeddedEventStore(new InMemoryEventStorageEngine());
    }

    @Bean
    SagaStore sagaStore() { return new InMemorySagaStore(); }

    @Bean
    EventScheduler eventScheduler(EventStore eventStore) {
        return new SimpleEventScheduler(
            Executors.newScheduledThreadPool(5),
            eventStore
        );
    }

    @Bean
    public ResourceInjector resourceInjector() { return new SpringResourceInjector(); }
}

`

the issue i’m facing is that there is an illegalArgumentException thrown at org.axonframework.messaging.annotation.AnnotatedMessageHandlingMember.java:91 stating that “object is not an instance of declaring class”. From what i see, what causes the error is that i’ve brilliantly managed to set up axon so that, at this line, it’s trying to call a saga’s event handling method on another type of saga (which is set up to handle the event as well)

here is the full stacktrace:

`

java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77]
at org.axonframework.messaging.annotation.AnnotatedMessageHandlingMember.handle(AnnotatedMessageHandlingMember.java:91) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.SagaMethodMessageHandlingMember.handle(SagaMethodMessageHandlingMember.java:73) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.AnnotatedSaga.lambda$null$3(AnnotatedSaga.java:102) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.SagaLifecycle.executeWithResult(SagaLifecycle.java:64) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.AnnotatedSaga.lambda$handle$4(AnnotatedSaga.java:102) ~[axon-core-3.0-M5.jar:3.0-M5]
at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_77]
at org.axonframework.eventhandling.saga.AnnotatedSaga.handle(AnnotatedSaga.java:100) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.AbstractSagaManager.doInvokeSaga(AbstractSagaManager.java:109) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.AbstractSagaManager.handle(AbstractSagaManager.java:71) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.saga.AbstractSagaManager.handle(AbstractSagaManager.java:39) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:57) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.AbstractEventProcessor.lambda$process$5(AbstractEventProcessor.java:124) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.BatchingUnitOfWork.executeWithResult(BatchingUnitOfWork.java:65) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.AbstractEventProcessor.process(AbstractEventProcessor.java:112) [axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.DirectEventProcessingStrategy.handle(DirectEventProcessingStrategy.java:27) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.SubscribingEventProcessor.lambda$start$0(SubscribingEventProcessor.java:104) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.AbstractEventBus.lambda$prepareCommit$10(AbstractEventBus.java:191) ~[axon-core-3.0-M5.jar:3.0-M5]
at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:890) ~[na:1.8.0_77]
at java.util.concurrent.CopyOnWriteArraySet.forEach(CopyOnWriteArraySet.java:404) ~[na:1.8.0_77]
at org.axonframework.eventhandling.AbstractEventBus.prepareCommit(AbstractEventBus.java:191) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventsourcing.eventstore.AbstractEventStore.prepareCommit(AbstractEventStore.java:64) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.AbstractEventBus.doWithEvents(AbstractEventBus.java:179) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.eventhandling.AbstractEventBus.lambda$null$3(AbstractEventBus.java:131) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.MessageProcessingContext.notifyHandlers(MessageProcessingContext.java:68) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.DefaultUnitOfWork.notifyHandlers(DefaultUnitOfWork.java:88) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.changePhase(AbstractUnitOfWork.java:214) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.commitAsRoot(AbstractUnitOfWork.java:83) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.commit(AbstractUnitOfWork.java:71) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.messaging.unitofwork.DefaultUnitOfWork.executeWithResult(DefaultUnitOfWork.java:77) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:143) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:119) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.SimpleCommandBus.dispatch(SimpleCommandBus.java:89) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.gateway.AbstractCommandGateway.send(AbstractCommandGateway.java:79) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.gateway.DefaultCommandGateway.send(DefaultCommandGateway.java:90) ~[axon-core-3.0-M5.jar:3.0-M5]
at org.axonframework.commandhandling.gateway.DefaultCommandGateway.sendAndWait(DefaultCommandGateway.java:108) ~[axon-core-3.0-M5.jar:3.0-M5]
at com.mbenabda.tontine.interfaces.web.mini.app.configuration.mockData.MockDataInitilizingAppLifecycleListener.createTontine(MockDataInitilizingAppLifecycleListener.java:69) ~[classes/:na]
at com.mbenabda.tontine.interfaces.web.mini.app.configuration.mockData.MockDataInitilizingAppLifecycleListener.initializeFakeData(MockDataInitilizingAppLifecycleListener.java:50) ~[classes/:na]
at com.mbenabda.tontine.interfaces.web.mini.app.configuration.mockData.MockDataInitilizingAppLifecycleListener.onApplicationEvent(MockDataInitilizingAppLifecycleListener.java:40) ~[classes/:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:382) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:336) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:877) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]

`

did anyone else encounter this issue, and can anyone help with it ? i can provide access to the codebase if required.

Thank you

Hi,

it seems to be a bug in the InMemorySagaStore, which doesn’t check for the correct Saga type when returning an instance. So it returns a Saga of an unexpected type, causing the exception you reported.

Cheers,

Allard

thank you so much Allard for your answer.
I’ll submit a PR for this.

Mehdi