簡體   English   中英

當我在春季批處理中將FlatFileItemWriter配置為具有scpoe =“ step”的流時,java.lang.IllegalStateException

[英]java.lang.IllegalStateException when i configure FlatFileItemWriter as stream with scpoe=“step” in 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>

這是我得到的例外:

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使用該代理時,它只會看到原始類的“接口”,而不是類本身。 因此,如果嘗試將此代理注入另一個組件,則定義的屬性需要具有匹配的接口類型。 它將拒絕將其注入到您具有特定類作為定義類型的屬性的位置。

查看您的異常,您會看到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

似乎在bean的某個地方有一個名為“ writer”的屬性,該屬性定義為FlatFileItemReader,應在其中注入此代理。

但是,在您提供的代碼中看不到。

是否有另一個Bean,您嘗試在其中將“ rejectFileItemWriter”注入類型為“ FlatFileItemReader”的名為“ writer”的屬性中? 如果是,則將這種類型更改為“ ResourceAwareItemWriterItemStream”接口可以解決問題。 從您的代碼中,我假設您在處理器中使用此編寫器來記錄“已拒絕”文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM