2

我已经编辑了这个,因为我意识到我误诊了错误的原因。该错误是因为我在由 bean 实例化的抽象类中有一个异步方法。我已将此方法添加到下面的抽象类中。如果我注释掉 @Async 注释,代码将构建并“运行”。这给了我现在可以查看的地方,但我会留下这个问题,以防有人可以帮助并让我更快地启动和运行!

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

我遇到了一个错误,我认为该错误记录得很好,但我无法理解文档。本质上,一个 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>

这很好用(Spring 4 MVC java 8(从 7 升级,代码转换最少)。

到目前为止的代码配置看起来像这样

    @Configuration
    @EnableAsync
    public class AsyncConfiguration {

    @Bean
    public ThreadPoolTaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(30);
        executor.setQueueCapacity(15);
        executor.setThreadNamePrefix("threadPoolTaskExecutor-");
        executor.initialize();
        return executor;
    }

    @Bean
    public AsyncAccountReader dataReader() throws Exception {
        return new AsyncAccountReader();
    }

    @Bean
    public AsyncAccountWriter dataWriter() throws Exception {
        return new AsyncAccountWriter();
    }

    @Bean
    public AsyncDataTransformer esProjectTransformer() throws Exception {
        return new AsyncDataTransformer("Account", dataReader(), dataWriter());   
    }

AsyncAccountReader 没有引起任何问题当我包含基于抽象类的类的编写器时出现错误(上图),因此沿着这些线

界面

public interface TransformWriter<T> {
    void writePage(int page, List<T> pageItems, TransformCompleteCallback callback);
}

抽象类

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) {
        ...

因此,如果我包含太多或削减太多以试图指出相关内容,请道歉。

关键是我认为如果我删除 @Async 注释,代码会构建并运行,否则我会收到上面的错误。谁能告诉我为什么这是一个问题,并指出我实施解决方案的写作方向?

4

0 回答 0