我们有一个当前应用程序,它使用在 XML 中配置的 FlatFileItemWriter 来生成固定长度的记录文件(“FileItemWriter”)。我们想添加第二个 ItemWriter 作为 Java 类,它将处理相同的块以更新 DB 中的 hstory 表(“HistoryItemWriter”)。已经实现了第三个 Java ItemWriter(“DispatcherItemWriter”)来依次调用这些家伙中的每一个,传递块。
问题是将 XML 中配置的 FlatFileItemWriter 的引用注入 DispatcherItemWriter 类中的 FlatFileItemWriter 属性。日志显示正在检索的 bean 引用,但随后会引发 ConversionNotSupportedexception(下面的日志片段)。
DispatcherItemWriter Java 类中的 FlatFileItemWriter 属性被定义为参数化,但无法在 XML 中类似地表示参数化,尽管至少有一篇文章表明这在 4.0 中是可能的(目前还不是一个选项)。
我尝试了各种使用@Autowired、@Resource 和无注释的方法,加上定义带有和不带参数化的属性,并且还尝试了 bean 上的 'p:fileItemWriter-ref="fileItemWriter"' 和 'property bean 中的 name="fileItemWriter" ref="fileItemWriter"'。Spring 发现 bean 没问题,但总是以“找不到匹配的编辑器或转换策略”而失败。
有没有人在 3.2 中做到这一点?
这是 fileItemWriter 配置:
<bean id="fileItemWriter"
class="org.springframework.batch.item.file.FlatFileItemWriter"
scope="step">
<property name="resource" value="file:${strRunFileName}" />
<property name="lineAggregator">
. . . etc.
</property >
</bean>
这是 dispatcherItemWriter bean 配置:
<bean id="dispatcherItemWriter"
class="com.xyz.DispatcherItemWriter"
scope="step">
<property name="fileItemWriter" ref="fileItemWriter" />
</bean>
这是 historyItemWriter 配置:
<bean id="historyItemWriter"
class="com.xyz.HistoryItemWriter"
scope="step"
p:dataSource-ref="dataSource" />
这是 HistoryItemWriter 类中的变量声明:
@Component
public class RejectItemWriter implements ItemWriter<RejectResult> {
// fileItemWriter is defined in module-context.xml
@SuppressWarnings("rawtypes")
// @Autowired
@Resource(name="fileItemWriter")
// private FlatFileItemWriter <Result> fileItemWriter;
private FlatFileItemWriter fileItemWriter;
这是小任务:
<batch:tasklet>
<batch:chunk
reader="itemReader"
processor="ItemProcessor"
writer="dispatcherItemWriter"
commit-interval="1000" />
</batch:tasklet>
这是日志的相关部分:
16:31:48.342 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory -
Returning cached instance of singleton bean 'fileItemWriter'
16:31:48.342 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory -
Failed to convert bean 'fileItemWriter'
to required type
[org.springframework.batch.item.file.FlatFileItemWriter]
org.springframework.beans.ConversionNotSupportedException:
Failed to convert value of type 'sun.proxy.$Proxy10 implementing
org.springframework.batch.item.file.ResourceAwareItemWriterItemStream,
org.springframework.beans.factory.InitializingBean,
org.springframework.batch.item.ItemWriter,
org.springframework.batch.item.ItemStream,
java.io.Serializable,
org.springframework.aop.scope.ScopedObject,
org.springframework.aop.framework.AopInfrastructureBean,
org.springframework.aop.SpringProxy,
org.springframework.aop.framework.Advised'
to required type
'org.springframework.batch.item.file.FlatFileItemWriter';
nested exception is java.lang.IllegalStateException:
Cannot convert value of type [sun.proxy.$Proxy10 implementing
org.springframework.batch.item.file.ResourceAwareItemWriterItemStream,
org.springframework.beans.factory.InitializingBean,
org.springframework.batch.item.ItemWriter,
org.springframework.batch.item.ItemStream,
java.io.Serializable,
org.springframework.aop.scope.ScopedObject,
org.springframework.aop.framework.AopInfrastructureBean,
org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]
to required type [org.springframework.batch.item.file.FlatFileItemWriter]:
no matching editors or conversion strategy found
注意org.springframework.batch.item.ItemWriter在实现的接口列表中,所有的接口和实现类都是参数化的。