java.lang.IllegalStateException当我在Spring批处理中将FlatFileItemWriter配置为scpoe =“step”的流时

时间:2015-11-18 05:14:18

标签: java spring spring-batch

我正在使用spring批处理,并且我正在尝试将FlatFileItemWriter配置为流以将导致异常的所有记录记录到另一个平面文件中,我需要配置scope="step"以便我可以使用用于配置的占位符。

当我放置scope="step"时,我得到一个例外,但是当我删除它时,异常就会消失。

以下是作业的配置:

<batch:job id="helloWorldJob">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="cvsFileItemReader" writer="cvsFileItemWriter"
                processor="itemProcessor" commit-interval="10" skip-limit="9999">
                <batch:skippable-exception-classes>
                    <batch:include class="java.lang.Exception" />
                    <batch:exclude class="java.io.FileNotFoundException" />
                </batch:skippable-exception-classes>
                <batch:streams>
                    <batch:stream ref="rejectFileItemWriter" />
                </batch:streams>
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="skipListner" />
            </batch:listeners>
        </batch:tasklet>
    </batch:step>
</batch:job>

以下是具有属性writer的跳过侦听器的配置:

<bean id="skipListner" class="com.mykong.skipListner.RecordSkipListener">
    <property name="writer" ref="rejectFileItemWriter"></property>
</bean>

这是我对作者的配置:

<bean id="rejectFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">

    <property name="resource" value="#{jobParameters['REJECTFILE']}" />

    <property name="lineAggregator">
        <bean
            class="org.springframework.batch.item.file.transform.PassThroughLineAggregator">
        </bean>
    </property>

</bean>

以下是我得到的例外情况:

java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy2 implementing org.springframework.batch.item.file.ResourceAwareItemWriterItemStream,org.springframework.beans.factory.InitializingBean,org.springframework.batch.item.ItemWriter,org.springframework.batch.item.ItemStream,org.springframework.aop.scope.ScopedObject,java.io.Serializable,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.batch.item.file.FlatFileItemWriter] for property 'writer': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:264)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:450)
    ... 17 more

1 个答案:

答案 0 :(得分:3)

如果在组件上设置scope = step,则spring将仅为该组件创建代理。 当Spring使用该代理时,它只能看到&#34;接口&#34;原始类,而不是类本身。 因此,如果它尝试将此代理注入另一个组件,则定义的属性需要具有匹配的接口类型。它会拒绝将它注入某个地方,在那里你拥有一个具有定义类型的具体类的属性。

查看您的异常,您会看到FlatFileItemReader的scoped-proxy实现了接口

org.springframework.batch.item.file.ResourceAwareItemWriterItemStream
org.springframework.beans.factory.InitializingBean
org.springframework.batch.item.ItemWriter
org.springframework.batch.item.ItemStream
org.springframework.aop.scope.ScopedObject java.io.Serializable
org.springframework.aop.framework.AopInfrastructureBean
org.springframework.aop.SpringProxy
org.springframework.aop.framework.Advised

似乎有一个名为&#34;作家&#34;在bean中,它被定义为FlatFileItemReader,应该注入此代理。

但是,我在您提供的代码中没有看到这一点。

是否有另一个Bean尝试注入&#39; rejectFileItemWriter&#39;进入名为&#34;作家&#34;使用&#34; FlatFileItemReader&#34;?如果是,请将此类型更改为界面&#39; ResourceAwareItemWriterItemStream&#39;可以做到这一点。 从我的代码中,我假设您在处理器中使用此编写器来记录&#34;拒绝&#34;文件。