我已经编辑了这个,因为我意识到我误诊了错误的原因。导致该错误的原因是我在抽象类中有一个异步方法,该方法由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注释代码构建并运行,如果不是我得到上面的错误。任何人都可以告诉我为什么这是一个问题,并指出我在实施解决方案的写作方向?