我已经编辑了这个,因为我意识到我误诊了错误的原因。该错误是因为我在由 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 注释,代码会构建并运行,否则我会收到上面的错误。谁能告诉我为什么这是一个问题,并指出我实施解决方案的写作方向?