1

我们有一个当前应用程序,它使用在 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在实现的接口列表中,所有的接口和实现类都是参数化的。

4

1 回答 1

0

无需创建DispatchItemWriter,spring batch 已经实现了您正在寻找的用例,使用CompositeItemWriter. 您可以在此处查找示例

于 2015-04-17T07:03:09.220 回答