Spring Batch CompositeProcessor每个处理器都有jdbcTemplate,第二个处理器说它是null

时间:2017-03-27 13:55:37

标签: spring spring-boot jdbctemplate

美好的一天。 我正在开发一个弹簧批处理过程,它有一个读取器,一个复合处理器和一个复合写入器。 第一个处理器使用数据源/ jdbc模板来读取记录以获取信息,并从或不传递记录。下一个处理器对数据源/ jdbc模板具有相同的配置,并且在java配置bean(Spring Boot)中以相同的方式设置,但jdbc模板将为null。 我在每个处理器中都有一个数据源设置器,然后创建已经在处理器中定义的jdbc模板。 处理器设置为“@JobScope”,因此他们可以使用命令行参数来确定过程中的某些操作。

@Bean
@JobScope
public FirstProcessor firstProcessor() {
    FirstProcessor firstProcessor = 
            new FirstProcessor();
    firstProcessor.setDataSource( dbReaderDataSource() );
    return firstProcessor;
}

@Bean
@JobScope
public SecondProcessor secondProcessor() {
    SecondProcessor secondProcessor = new SecondProcessor();
    secondProcessor.setDataSource( dbReaderDataSource() );
    return secondProcessor;
}

@Bean
@Primary
public DriverManagerDataSource dbReaderDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    String urlStr = "<url>";
    String driverStr = "<driver class name>";
    String usernameStr = "<userid>";
    String passwordStr = "<password>";
    dataSource.setUrl( urlStr );
    log.info("Setting Driver Class to: " + driverStr);
    dataSource.setDriverClassName( driverStr );
    dataSource.setUsername( usernameStr );
    dataSource.setPassword( passwordStr );

    return dataSource;
}

...在我的处理器中,我使用:

定义JdbcTemplate
JdbcTemplate jdbcTemplate;

....并使用setter设置它:

public void setDataSource( DriverManagerDataSource dS ) {
    this.jdbcTemplate = new JdbcTemplate( dS );
}

第一个处理器工作正常:第二个处理器在我这样做时抛出NPE 查询列表(....)“call。

我还尝试在处理器中设置Driver Manager数据源对象, 并且如果我在做之前发现它是null,则使用它来创建Jdbc模板 查询。我得到了:

java.lang.IllegalArgumentException:未指定DataSource ...当我尝试在处理器中设置jdbcTemplate数据源时。

任何建议都会有所帮助 谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试在构造函数上使用@Autowired,并让Spring在创建实例之前扫描要注入的依赖项。

@Autowired
public FirstProcessor(DriverManagerDataSource ds)
{
    this.jdbcTemplate = new JdbcTemplate(dS);
}

@Autowired
public SecondProcessor(DriverManagerDataSource ds)
{
    this.jdbcTemplate = new JdbcTemplate(dS);
}