2016-04-18 12 views
1

私はマルチファイルリーダーとフラットファイルライターを作成しました(後で、マルチファイル読み取りを複数ファイル書き込み、1対1マッピングに拡張する必要があります)。私はプロパティファイルを介して入力パスを提供するとき、それはすべてうまく動作しますが、私はjobExecutionContext経由でパスを提供しようとすると、エラーが発生し始めます。私が驚いているのは、writerがexecutionContextからのパスを正常に取得していて、どこの場所でも提供しているが、読者ではないということです。入力、出力パスを動的に提供中にエラーが発生しました

PS:ファイル内にあるデータが複数行レコードであり、1つのレコードが終了するタイミングを判断できないため、 "SingleItemPeekableItemReader"を使用しています。レコード2が開始されたことを知る唯一の方法は、次の行にアクセスし、その新しいレコードの開始を知っていることです。

誰かが何らかの光を当てることができますか、私は何をしていますか。

<bean id="itemReader" class="com.varun.reader.AccountDataReader"> 
    <property name="fieldSetReader"   ref="PeekableitemReader" /> 
    <property name="headerFieldSetMapper" ref="headerFieldSetMapper" /> 
    <property name="multiReader"   ref="multiResourceReader"/> 
</bean> 

<bean id="PeekableitemReader" class="org.springframework.batch.item.support.SingleItemPeekableItemReader" > 
    <property name="delegate" ref="multiResourceReader"/> 
</bean> 

<bean id="multiResourceReader" class=" org.springframework.batch.item.file.MultiResourceItemReader" > 
    <property name="resources" value="file:${file.input.dir}*.DAT" /> 
    <property name="delegate" ref="fileItemReader" /> 
</bean> 

<bean id="fileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 
    <property name="lineMapper"> 
     <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <property name="lineTokenizer" ref="accountDataTokenizer"/> 
      <property name="fieldSetMapper"> 
       <bean class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" /> 
      </property> 
     </bean> 
    </property> 
    <property name="comments" value=""></property> 
</bean> 

私は

<property name="resources" value="file:#{JobExecutionContext[input_dir]}*.DAT" /> 

エラーログ以下のようにmultiresourceReaderにリソースを提供するときには、以下のように、アウトエラー:ステップとしてマルチリーダースコープを行った後、私のようにエラーを取得しています

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'step1': Cannot resolve reference to bean 'itemReader' while setting bean property 'itemReader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemReader' defined in class path resource [spring/config/process-config.xml]: Cannot resolve reference to bean 'PeekableitemReader' while setting bean property 'fieldSetReader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'PeekableitemReader' defined in class path resource [spring/config/process-config.xml]: Cannot resolve reference to bean 'multiResourceReader' while setting bean property 'delegate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'multiResourceReader' defined in class path resource [spring/config/process-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'JobExecutionContext' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public? 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 

私は他のデリゲートリーダーにスコープを入れようとしましたが、同じエラーが発生しています。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'step1': Cannot resolve reference to bean 'itemReader' while setting bean property 'itemReader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemReader' defined in class path resource [spring/config/process-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type [com.sun.proxy.$Proxy11 implementing org.springframework.batch.item.ItemStreamReader,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.MultiResourceItemReader] for property 'multiReader'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy11 implementing org.springframework.batch.item.ItemStreamReader,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.MultiResourceItemReader] for property 'multiReader': no matching editors or conversion strategy found 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
at com.varun.JobScheduler.main(JobScheduler.java:9) 

マイカスタムリーダー

public class AccountDataReader implements ItemReader<AccountDataBO> { 
private static Log log = LogFactory.getLog(AccountDataReader.class); 
private boolean recordFinished; 

private AccountDataBO acctObj = new AccountDataBO(); 

private SingleItemPeekableItemReader<FieldSet> fieldSetReader; 
private HeaderFieldSetMapper headerFieldSetMapper; 
private MultiResourceItemReader<FieldSet> multiReader; 

@Override 
public AccountDataBO read() throws Exception { 
    recordFinished = false; 

    while (!recordFinished) { 
     process(fieldSetReader.read()); 
    } 
    AccountDataBO result = acctObj; 
    acctObj = new AccountDataBO(); 

    return result; 
} 

private void process(FieldSet fieldSet) throws Exception { 

    if (fieldSet == null) { 
     log.debug("FINISHED Reading"); 
     recordFinished = true; 
     acctObj=null; 
     return; 
    } 

    String lineId = fieldSet.readString(0); 

    if (!StringUtils.isEmpty(lineId) && lineId.contains(AccountDataBO.ACCOUNT)) { 
     log.debug("Starting new Record"); 
     acctObj.setHeader(headerFieldSetMapper.mapFieldSet(fieldSet)); 
     acctObj.setResource(multiReader.getCurrentResource()); 

    } 

    //Code 

} 

private void CheckEOFNewAccount() throws Exception { 
    if ((fieldSetReader.peek() != null 
      && ((fieldSetReader.peek().getValues())[0].contains(AccountDataBO.ACCOUNT))) 
      || fieldSetReader.peek() == null) { 
     log.debug("Next Line is Account or EOF Hence returning for current Account"); 
     recordFinished = true; 
     return; 
    } 
} 

public void setFieldSetReader(SingleItemPeekableItemReader<FieldSet> fieldSetReader) { 
    this.fieldSetReader = fieldSetReader; 
} 

public void setHeaderFieldSetMapper(HeaderFieldSetMapper headerFieldSetMapper) { 
    this.headerFieldSetMapper = headerFieldSetMapper; 
} 

public void setMultiReader(MultiResourceItemReader<FieldSet> multiReader) { 
    this.multiReader = multiReader; 
} 

}

答えて

2

バッチ成分にジョブパラメータを注入するために、コンポーネントは、工程がスコープする必要があります。それは、再びエラーアウトiのステップとしてマルチリーダスコープとき

<bean id="multiResourceReader" 
     class=" org.springframework.batch.item.file.MultiResourceItemReader" 
     scope="step" > 
+0

:これに

<bean id="multiResourceReader" class=" org.springframework.batch.item.file.MultiResourceItemReader" > 

:だからあなたの例では、これを変更します。主な質問のログを更新しました。 –

+0

あなたのカスタム 'ItemReader'は単なる' ItemReader'ではなく特定の実装を期待しているようです。インターフェイスへのコードと追加のエラーは消えてしまいます。 –

+0

あなたの 'AccountDataReader'(' AccountDataReader#set MultiReader')のセッターが 'ItemReader'ま​​たは' ItemStreamReader'の代わりに 'MultiResourceItemReader'を探しています。 'ItemReader'を取るか、ステップスコープをプロキシモード' TARGET_CLASS'に変更するように変更すれば、エラーは消えてしまいます。 –

関連する問題