Spring package: scope ("step") failed

I could use scope = "step" in the xml configuration without any problems, but if I use it as an annotation, as shown below, it produces the following error:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'step1' defined in class path resource [BatchConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [org.springframework.batch.item.ItemReader]: : Error creating bean with name 'reader': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reader': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope

The main thing:

The scope of the step is inactive for the current thread;

what reason?

public class BatchConfiguration {

    @Bean
    @Scope("step")
    public ItemReader<Source> reader(@Value("#{jobParameters['fileName']}") String fileName) {
        System.out.println("*****************************");
        System.out.println("read file of "+fileName);
        System.out.println("*****************************");
        FlatFileItemReader<Source> reader = new FlatFileItemReader<Source>();

        reader.setResource(new FileSystemResource(fileName));
        reader.setLineMapper(new DefaultLineMapper<Source>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "firstName", "lastName" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Source>() {{
                setTargetType(Source.class);
            }});
        }});
        return reader;
    }
+4
source share
1 answer

You need to use either of two methods:

   @Scope(value="step",
   proxyMode=TARGET_CLASS)

or

 @Bean
 @StepScope
+10
source

All Articles