Spring 3.2 - 如何将 XML 中配置的 FlatFileItemWriter 注入 java class 中的参数化 属性

Spring 3.2 - how to inject FlatFileItemWriter configured in XML to parameterized property in java class

我们当前有一个应用程序使用 XML 中配置的 FlatFileItemWriter 来生成固定长度的记录文件 ("FileItemWriter")。我们想添加第二个 ItemWriter 作为 Java class,它将处理相同的块以更新数据库中的 hstory table ("HistoryItemWriter")。第三个 Java ItemWriter ("DispatcherItemWriter") 已经实现,依次调用每个人,传递块。

问题是将对 XML 中配置的 FlatFileItemWriter 的引用注入 DispatcherItemWriter class 中的 FlatFileItemWriter 属性。日志显示正在检索的 bean 引用,但随后会抛出 ConversionNotSupportedexception(下面的日志片段)。

DispatcherItemWriter Java class 中的 FlatFileItemWriter 属性 被定义为参数化,但没有办法在 XML 中类似地表示参数化,尽管至少有一个post 表明这在 4.0 中是可能的(现在不是一个选项)。

我已经尝试了多种使用@Autowired、@Resource 和无注解的方法,结合使用和不使用参数化定义 属性,并且还在 bean 上尝试了两种 'p:fileItemWriter-ref="fileItemWriter"'和 bean 中的 'property name="fileItemWriter" ref="fileItemWriter"'。 Spring 发现 bean 正常,但总是失败 "no matching editors or conversion strategy found"。

有人在 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 中的变量声明 class:

    @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;

这是 Tasklet:

<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在实现的接口列表中,所有的接口和实现classes都是参数化的。

无需创建 DispatchItemWriter,spring 批处理已经实现了您正在寻找的用例,请使用 CompositeItemWriter。您可以查找示例 here