Como se abre um Reader ao implementar o ItemReader em um projeto do Spring Batch?

Em um projeto do Spring Batch, preciso compor um registro com várias linhas. Estou implementandoItemReader acumular várias linhas antes de retornar um objeto. Depois de trabalhar com vários exemplos de projetos, eu os reuni, mas estou diante de umaReaderNotOpenException.

Eu verifiquei três vezes o caminho para o arquivo está correto. Quando eu depuro odelegate contém o caminho do recurso e do arquivo do meu arquivo de configuração.

Qualquer ajuda apreciada.

Arquivo de configuração:

    <bean id="cvsFileItemReader" class="com.mkyong.XYZFileRecordReader">
    <property name="delegate">
        <bean class="org.springframework.batch.item.file.FlatFileItemReader">
            <property name="resource" value="classpath:ma/report-headeronly.psv" />
            <property name="lineMapper">
                <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                    <property name="lineTokenizer">
                        <bean
                            class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                            <property name="delimiter" value="|" />
                        </bean>
                    </property>
                    <property name="fieldSetMapper">
                        <bean class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

Meu Leitor:

package com.mkyong;

import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.transform.FieldSet;

import com.mkyong.model.XYZFileHeaderRecord;

public class XYZFileRecordReader implements ItemReader<XYZFileHeaderRecord>, ItemStream {

private FlatFileItemReader<FieldSet> delegate;

@Override
public XYZFileHeaderRecord read() throws Exception,
        UnexpectedInputException, ParseException,
        NonTransientResourceException {

    XYZFileHeaderRecord maFileHeaderRecord = new XYZFileHeaderRecord();

    for (FieldSet line = null; (line = this.delegate.read()) != null;) {
        String firstToken = line.readString(0);
        if (firstToken.equals("File ID")) {
            maFileHeaderRecord.setFileName( line.readString(1) );
        } else if (firstToken.equals("Date")) {
            maFileHeaderRecord.setDate( line.readString(1) );
            return maFileHeaderRecord;
        }
    }

    return null;
}

@Override
public void close() throws ItemStreamException {}

@Override
public void open(ExecutionContext arg0) throws ItemStreamException {}

@Override
public void update(ExecutionContext arg0) throws ItemStreamException {}

public FlatFileItemReader<FieldSet> getDelegate() {
    return delegate;
}

public void setDelegate(FlatFileItemReader<FieldSet> delegate) {
    this.delegate = delegate;
}
}

E meu stacktrace:

SEVERE: Encountered an error executing the step
org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read.
    at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:195)
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
    at com.mkyong.XYZFileRecordReader.read(XYZFileRecordReader.java:26)
    at com.mkyong.XYZFileRecordReader.read(XYZFileRecordReader.java:1)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155)
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:108)
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:127)
    at com.mkyong.App.main(App.java:27)
Apr 25, 2014 5:35:56 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=reportJob]] completed with the following parameters: [{}] and the following status: [FAILED]
Exit Status : FAILED
Done

questionAnswers(2)

yourAnswerToTheQuestion