Spring boot 使用@Async方法创建bean时出现代理错误

Spring boot 使用@Async方法创建bean时出现代理错误,spring-boot,javabeans,spring-async,spring-config,Spring Boot,Javabeans,Spring Async,Spring Config,我已经编辑了这篇文章,因为我意识到我已经误诊了错误的原因。导致此错误的原因是,我在由bean实例化的抽象类中有一个异步方法。我已将此方法添加到下面的抽象类中。如果我注释掉@Async注释,代码将生成并“运行”。这给了我一个可以看的地方,但我会把问题留给别人,以防有人能帮助我,让我跑得更快一点 我正在尝试重构一个java/spring应用程序,它使用xml配置来使用SpringBoot和代码配置。对我来说,这是一条非常古老的学习曲线 我遇到了一个错误,我认为这个错误有很好的文档记录,但我无法理解文

我已经编辑了这篇文章,因为我意识到我已经误诊了错误的原因。导致此错误的原因是,我在由bean实例化的抽象类中有一个异步方法。我已将此方法添加到下面的抽象类中。如果我注释掉@Async注释,代码将生成并“运行”。这给了我一个可以看的地方,但我会把问题留给别人,以防有人能帮助我,让我跑得更快一点

我正在尝试重构一个java/spring应用程序,它使用xml配置来使用SpringBoot和代码配置。对我来说,这是一条非常古老的学习曲线

我遇到了一个错误,我认为这个错误有很好的文档记录,但我无法理解文档记录。本质上,创建一个bean,然后在另一个bean的构造函数中使用。当我把它移到代码配置时,我得到的错误是

Failed to instantiate [com.app.data.dataTransformer]: 
    Factory method 'dataTransformerObj' threw exception; nested exception is java.lang.IllegalStateException: 
    @Bean method AsyncConfiguration.dataWriteBean called as a bean reference for type 
        [com.app.data.dataWriteBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy118]. 
通过一些谷歌搜索,我认为这与将一个bean传递到另一个bean的机制有关,从而使这个bean成为代理bean

所以xml配置是这样的

<beans:bean id="dataReader" class="AsyncAccountReader"/>
<beans:bean id="dataWriter" class="AsyncAccountWriter"/>
<beans:bean class="DataTransformer">
    <beans:qualifier value="dataTransformerObj"/>
    <beans:constructor-arg index="0" value="Account"/>
    <beans:constructor-arg index="1" ref="dataReader"/>
    <beans:constructor-arg index="2" ref="dataWriter"/>
    <beans:constructor-arg index="3" ref="threadPoolTaskExecutor"/>
    <beans:constructor-arg index="4" value="10"/>
    <beans:property name="displayOrder" value="4"/>
</beans:bean>
AsyncAccountReader没有引起任何问题当我包括writer时(上面的错误),writer是一个基于抽象类的类

接口

public interface TransformWriter<T> {
    void writePage(int page, List<T> pageItems, TransformCompleteCallback callback);
}
公共接口转换器{
void writePage(int页、列表页项、TransformCompleteCallback回调);
}
抽象类

public abstract class AbstractTransformWriter<T> implements TransformWriter<T> {

    @Async
    @Override
    public void writePage(int page, List<T> pageItems, TransformCompleteCallback callback) {
        try {
            asyncWritePage(page, pageItems);
        } catch (Exception e) {
            LOGGER.error("Failed to run async writePage", e);
        } finally {
            callback.callback();
        }
    }

    public abstract void asyncWritePage(int page, List<T> pageItems);
}
public class AsyncAccountWriter extends AbstractTransformWriter<Account> {

    @Autowired
    public void setDbService(DBService dbService) {
        this.dbService= dbService;
    }

    @Override
    public void asyncWritePage(int page, List<Account> accounts) {
        ...
公共抽象类AbstractTransformWriter实现TransformWriter{
@异步的
@凌驾
public void writePage(int页、列表页项、TransformCompleteCallback回调){
试一试{
asyncWritePage(第页,第页项目);
}捕获(例外e){
LOGGER.error(“无法运行异步writePage”,e);
}最后{
callback.callback();
}
}
公共摘要无效asyncWritePage(整版页,列表页项);
}
混凝土等级

public abstract class AbstractTransformWriter<T> implements TransformWriter<T> {

    @Async
    @Override
    public void writePage(int page, List<T> pageItems, TransformCompleteCallback callback) {
        try {
            asyncWritePage(page, pageItems);
        } catch (Exception e) {
            LOGGER.error("Failed to run async writePage", e);
        } finally {
            callback.callback();
        }
    }

    public abstract void asyncWritePage(int page, List<T> pageItems);
}
public class AsyncAccountWriter extends AbstractTransformWriter<Account> {

    @Autowired
    public void setDbService(DBService dbService) {
        this.dbService= dbService;
    }

    @Override
    public void asyncWritePage(int page, List<Account> accounts) {
        ...
公共类AsyncAccountWriter扩展了AbstractTransformWriter{
@自动连线
公共无效setDbService(DBService DBService){
this.dbService=dbService;
}
@凌驾
公共无效asyncWritePage(整版页,列出帐户){
...
因此,如果我为了指出相关内容而包含太多或删减太多内容,请道歉


问题是,如果我删除@Async注释,代码就会生成并运行,如果没有,我就会得到上面的错误。有人能告诉我为什么这是一个问题,并为我指明实现解决方案的写入方向吗?

目前我似乎已经解决了这个问题(现在判断它是否已修复或只是在启动时不再中断还为时过早)通过将配置注释更改为@enablesync(proxyTargetClass=true)。我会继续在谷歌上搜索,但所有与此相关的答案似乎都将大量知识视为理所当然。如果有人能解释或为我指明一个方向,真正解释这些代理创建错误背后发生的事情,我将不胜感激(&接受这个答案…)我还没有完全理解它,但我认为基本问题已经在这里得到了很好的解释。我正在考虑添加这两个问题作为一个答案,以防它对其他人有帮助,但如果这违反了协议,我很乐意删除这个问题。无论如何,如果有人做出任何其他贡献,我会等待。