使用@Autowire时抛出Spring Cloud AWS InstantiationException

时间:2015-01-08 05:00:29

标签: spring amazon-web-services reflection annotations spring-cloud

我喜欢使用构造函数添加依赖项的能力。特别是自动装配这些依赖项。

e.g。

public class MyClass {
    private final Dependency dependency;

    @Autowired
    public MyClass(@Qualifier("bean-id") Dependency dependency) {
        this.dependency = dependency;
    }

}

我发现Spring Cloud AWS框架引发了一个" InstantiationException"如果"依赖"上面的类碰巧是一个传递给Workflow worker的类,并且缺少一个默认的空构造函数。

具体例子:

public class MyClass {
    private final DependencyWorkflowClientExternalFactory clientFactory;

    @Autowired
    public MyClass(@Qualifier("bean-id") DependencyWorkflowClientExternalFactory clientFactory) {
        this.clientFactory = clientFactory;
    }
}

public class WorkflowInitializer {

    @Autowired
    private WorkflowWorker workflowWorker; //assume wired with correct credentials    

    public WorkflowInitialiser() {
         init();
    }

    public init() {
        workflowWorker.addWorkflowImplementationType(MyClass.class);
    }
}

以上失败了:

java.lang.InstantiationException: com.mypackage.MyClass
at java.lang.Class.newInstance(Class.java:359)

我必须做类似的事情:

public class MyClass {
    @Autowired
    @Qualifier("bean-id")
    private Dependency dependency; 

    public MyClass() {
    }
}

问题是:

Spring Cloud框架的当前版本是否有可能在构造函数上使用@Autowire注释?是否要求将注释添加到实例字段?

我问(并假设"是")因为Workflow工作者采用类类型,而不是实例化工作流的对象实例。

作为第二个问题:

为什么ActivityWorkers会获取对象的实例,但WorkflowWorkers会接受类?

1 个答案:

答案 0 :(得分:1)

此问题实际上与Spring Cloud AWS无关,而与AWS Flow Framework for Java无关。

您正在使用"默认" WorkflowWorker将工作流实现实例化为POJO。因此,您的类MyClass不是作为Spring bean创建的,而是作为POJO创建的。

您应该使用AWS Flow Framework提供的SpringWorkflowWorker来更好地与Spring集成。有关更多信息,请查看解释与Spring集成的AWS Flow Framework documentation