如何在春季批处理中将Bean从处理器传递到写入器?

时间:2018-10-08 10:29:41

标签: java spring spring-boot spring-batch

在我的春季批处理代码中,我正在读取一个csv文件,将其处理为bean,并尝试使用writer中的值获取bean。但是我无法让豆子成为作家。 UserVO是具有csv文件中的值的Bean,我正在尝试将其写入writer。我也将bean初始化为一个公共变量,希望它将由reader,processor和writer处理。甚至在@Bean之前使用了@AutowiredUserVO user = new UserVO();注释。请帮助我解决这个问题。以下是我的代码

@EnableBatchProcessing
@Configuration
public class CsvFileToDatabaseConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public DataSource dataSource;

    UserVO user = new UserVO();

    @Bean
    public FlatFileItemReader<UserVO> csvReader() {
         FlatFileItemReader<UserVO> reader = new FlatFileItemReader<UserVO>();
        try{

        reader.setResource(new ClassPathResource("user.csv"));
        reader.setLineMapper(new DefaultLineMapper<UserVO>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "memberId", "mailId", "fullName", "appCode", "active"});
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<UserVO>() {{
                setTargetType(UserVO.class);
            }});
        }});

        }
        catch(Exception e){
            System.out.println(" Exception in reading " + e.getMessage());
        }
         return reader;
    }


    @Bean
    ItemProcessor<UserVO, UserVO> csvProcessor() {          
        return new Processor();
    }

    @Bean
    public JdbcBatchItemWriter<UserVO> csvWriter(UserVO user) {
         JdbcBatchItemWriter<UserVO> csvWriter = new JdbcBatchItemWriter<UserVO>();
         System.out.println("MEMBER ID --->" + user.memberId);
        return csvWriter;
    }

    @Bean
    public Step csvFileToDatabaseStep() throws Exception {
        LDSService ldsService = new LDSService();

        return stepBuilderFactory.get("csvFileToDatabaseStep")
                .<UserVO, UserVO>chunk(1)
                .reader(csvReader())
                .processor(csvProcessor())
                .writer(csvWriter(user))            
                .build();
    }

    @Bean
    Job csvFileToDatabaseJob(JobCompletionNotificationListener listener) throws Exception {
        return jobBuilderFactory.get("csvFileToDatabaseJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(csvFileToDatabaseStep())
                .end()
                .build();
    }

}

2 个答案:

答案 0 :(得分:0)

public class SkipFooterLineItemProcessor implements ItemProcessor<UserVO, UserVO> {


    @Override
    public UserVO process(UserVO item) throws Exception {

       return item;

    }
}

答案 1 :(得分:0)

在您回答问题之前,我想弄清楚您对事物运作方式的理解有些困惑。

当您为Spring Batch组件(读取器,写入器等)定义Spring bean时,此时没有实际的读取或写入操作。您仅定义工作步骤中要使用的bean。当您编写此代码时:

<a href="{{ path('patient_booking_confirmation') }}?idMedecin={{ medecin.id }}&date={{ date }}&heure={{ time }}" class="boutonBookingPage" id="confirmationPaiement">Confirmer votre Rendez-Vous</a>

捕获异常并打印@Bean public FlatFileItemReader<UserVO> csvReader() { FlatFileItemReader<UserVO> reader = new FlatFileItemReader<UserVO>(); try{ reader.setResource(new ClassPathResource("user.csv")); reader.setLineMapper(new DefaultLineMapper<UserVO>() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[] { "memberId", "mailId", "fullName", "appCode", "active"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper<UserVO>() {{ setTargetType(UserVO.class); }}); }}); } catch(Exception e){ System.out.println(" Exception in reading " + e.getMessage()); } return reader; } 意味着您认为这种方法正在读取,而没有读取。此方法仅定义该步骤将使用的项目读取器。实际读取将通过面向块的步骤自动调用的Exception in reading方法完成。对于作者而言,也是一样(关于org.springframework.batch.item.ItemReader#read)。

现在,您无需创建System.out.println("MEMBER ID --->" + user.memberId);的实例,只需要指定CSV文件的每一行都应映射到哪个域类型,阅读器就会创建该类型的实例。 (如UserVO在评论中所述)。因此,您需要删除以下行:M. Deinum,您的工作定义应该没问题。

您可以在https://spring.io/guides/gs/batch-processing/入门指南中找到类似的用例。您将看到不需要手动创建域类型为UserVO user = new UserVO();的实例。

希望这可以帮助并澄清一些事情。