简体   繁体   中英

Access Job Parameter in Custom ItemProcessor

I am implementing a custom ItemProcessor<I, O> in spring batch for processing data from a Rest api.

I want access some values from jobParameter inside my ItemProcessor class. Any suggestion on how to do that?

In Tasklet we can access JobParameter but not sure how to do in ItemProcessor.

MyItemProcessor.java

@Component  
public class MyItemProcessor implements ItemProcessor<User, UserDetails> {
    

    @Override
    public UserDetails process(User user) throws Exception {
        // access values from job parameter here

        return null;
    }
}

You can make your item processor step-scoped and inject job parameters in it. The following is one way of doing that:

@Component
@StepScope  
public class MyItemProcessor implements ItemProcessor<User, UserDetails> {
    
    @Value("#{jobParameters}")
    private JobParameters jobParameters;

    @Override
    public UserDetails process(User user) throws Exception {
        // access values from job parameter here

        return null;
    }
}

You could also inject a specific parameter if you want with something like the following:

@Component
@StepScope  
public class MyItemProcessor implements ItemProcessor<User, UserDetails> {
    
    @Value("#{jobParameters['myParameter']}")
    private String myParameter;

    @Override
    public UserDetails process(User user) throws Exception {
        // use myParameter as needed here

        return null;
    }
}

Since field injection is not recommended, you can inject job parameters in your item processor when you define it as a bean, something like:

// Note how nothing related to Spring is used here, and the processor can be unit tested as a regular Java class
public class MyItemProcessor implements ItemProcessor<User, UserDetails> {
    
    private String myParameter;

    public MyItemProcessor(String myParameter) {
        this.myParameter = myParameter;
    }

    @Override
    public UserDetails process(User user) throws Exception {
        // use this.myParameter as needed here

        return null;
    }
}

Once that in place, you can declare your item processor bean as follows:

@Bean
@StepScope
public MyItemProcessor itemProcessor(@Value("#{jobParameters['myParameter']}") String myParameter) {
    return new MyItemProcessor(myParameter);
}

Fore more details about scoped beans, please check the documentation here: Late Binding of Job and Step attributes .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM