Skip to content

Spring Boot, Workflows and dependency injection #1147

@jakesmolka

Description

@jakesmolka

Ask your question here

Without further knowledge about the Dapr Java SDK, is dependency injection for workflow activities (and probably workflows itself) not supported at the moment?

Check this example here: https://github.com/jakesmolka/dapr-workflow/blob/6629ad6935165a49147754187fc7b3ba4d073817/workflow-lib/src/main/java/org/example/flows/CreateResourceActivity.java

I get the following error, when running the workflow worker:

== APP == org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'worker' defined in URL [jar:nested:/Users/jake.smolka/Documents/code/temp/dapr-workflow/workflow-worker/target/workflow-worker-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/org/example/workflowworker/Worker.class]: Failed to instantiate [org.example.workflowworker.Worker]: Constructor threw exception
== APP == 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1337) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971) ~[spring-context-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.2.jar!/:3.3.2]
== APP == 	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.2.jar!/:3.3.2]
== APP == 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.2.jar!/:3.3.2]
== APP == 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.2.jar!/:3.3.2]
== APP == 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.2.jar!/:3.3.2]
== APP == 	at org.example.workflowworker.WorkflowWorkerApplication.main(WorkflowWorkerApplication.java:10) ~[!/:0.0.1-SNAPSHOT]
== APP == 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
== APP == 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
== APP == 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
== APP == 	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
== APP == 	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91) ~[workflow-worker-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
== APP == 	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53) ~[workflow-worker-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
== APP == 	at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58) ~[workflow-worker-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
== APP == Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.example.workflowworker.Worker]: Constructor threw exception
== APP == 	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:221) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:94) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1331) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	... 23 common frames omitted
== APP == Caused by: java.lang.RuntimeException: No constructor found for activity class 'org.example.flows.CreateResourceActivity'.
== APP == 	at io.dapr.workflows.runtime.ActivityWrapper.<init>(ActivityWrapper.java:40) ~[dapr-sdk-workflows-0.12.0.jar!/:na]
== APP == 	at io.dapr.workflows.runtime.WorkflowRuntimeBuilder.registerActivity(WorkflowRuntimeBuilder.java:93) ~[dapr-sdk-workflows-0.12.0.jar!/:na]
== APP == 	at org.example.workflowworker.Worker.<init>(Worker.java:22) ~[!/:0.0.1-SNAPSHOT]
== APP == 	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
== APP == 	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
== APP == 	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
== APP == 	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
== APP == 	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
== APP == 	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:195) ~[spring-beans-6.1.11.jar!/:6.1.11]
== APP == 	... 25 common frames omitted
== APP == Caused by: java.lang.NoSuchMethodException: org.example.flows.CreateResourceActivity.<init>()
== APP == 	at java.base/java.lang.Class.getConstructor0(Class.java:3585) ~[na:na]
== APP == 	at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754) ~[na:na]
== APP == 	at io.dapr.workflows.runtime.ActivityWrapper.<init>(ActivityWrapper.java:37) ~[dapr-sdk-workflows-0.12.0.jar!/:na]
== APP == 	... 33 common frames omitted

When removing the entire dependency injection it works (compiles, run, behaves as expected).

When using deprecated @Autowired field injection the worker compiles and runs but just gets a null object.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions