当我在 spring 批处理中使用 scpoe ="step"将 FlatFileItemWriter 配置为流时,出现 java.lang.IllegalStateException

标签 java spring spring-batch

我正在使用 Spring Batch,并尝试将 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>

以下是带有属性编写器的跳过监听器的配置:

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

这是我得到的异常(exception):

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

最佳答案

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

查看您的异常,您会发现 FlatFileItemReader 的作用域代理实现了接口(interface)

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

看起来,bean 中有一个名为“writer”的属性,该属性被定义为 FlatFileItemReader,应在其中注入(inject)此代理。

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

是否有另一个 Bean 试图将“rejectFileItemWriter”注入(inject)到名为“writer”且类型为“FlatFileItemReader”的属性中?如果是,将此类型更改为接口(interface)“ResourceAwareItemWriterItemStream”可以解决问题。 从您的代码中,我假设您在处理器中使用此编写器来记录“拒绝”的文件。

关于当我在 spring 批处理中使用 scpoe ="step"将 FlatFileItemWriter 配置为流时,出现 java.lang.IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33772287/

相关文章:

java - 即使指定完整的包路径也找不到类

spring - 如何在 spring rest Controller 中动态设置 produces 值?

java - 将本地 Java 项目 merge 到现有 git 存储库

java - 如何将 Spring Boot 中的配置属性注入(inject)到 Spring Retry 注释中?

java - Spring Batch Item Writer 没有被调用

java - 使用 spring-data-jpa 自定义 ItemReader

java - 如何使用 Process builder 从 java 运行 R 脚本

java - Oxygen.1a (4.7.1a) 的 FindBugs 插件

java - Android 阶段性进展

java - Spring 批处理 : Tasklet without ItemWriter