Spring 使用@Autowire 时抛出 Cloud AWS InstantiationException

Spring Cloud AWS InstantiationException thrown when using @Autowire

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

例如

public class MyClass {
    private final Dependency dependency;

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

}

我发现如果上面的 "Dependency" class 恰好是 class,Spring Cloud AWS 框架会抛出 "InstantiationException"它被传递给工作流工作者并且缺少默认的空构造函数。

具体例子:

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 云框架中是否可以在构造函数上使用 @Autowire 注释?是否要求在实例字段中添加注解?

我问(并假设 "yes")因为 Workflow 工作人员采用 class 类型,而不是对象的实例化来实现他们的工作流。

作为次要问题:

为什么 ActivityWorker 获取一个对象的实例,而 WorkflowWorkers 获取 class 个实例?

这个问题实际上与 Spring Cloud AWS 无关,而是 Java 的 AWS Flow Framework。

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

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