美好的一天。 我正在开发一个弹簧批处理过程,它有一个读取器,一个复合处理器和一个复合写入器。 第一个处理器使用数据源/ 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;
}
...在我的处理器中,我使用:
定义JdbcTemplateJdbcTemplate jdbcTemplate;
....并使用setter设置它:
public void setDataSource( DriverManagerDataSource dS ) {
this.jdbcTemplate = new JdbcTemplate( dS );
}
第一个处理器工作正常:第二个处理器在我这样做时抛出NPE 查询列表(....)“call。
我还尝试在处理器中设置Driver Manager数据源对象, 并且如果我在做之前发现它是null,则使用它来创建Jdbc模板 查询。我得到了:
java.lang.IllegalArgumentException:未指定DataSource ...当我尝试在处理器中设置jdbcTemplate数据源时。
任何建议都会有所帮助 谢谢。
答案 0 :(得分:0)
您可以尝试在构造函数上使用@Autowired,并让Spring在创建实例之前扫描要注入的依赖项。
@Autowired
public FirstProcessor(DriverManagerDataSource ds)
{
this.jdbcTemplate = new JdbcTemplate(dS);
}
和
@Autowired
public SecondProcessor(DriverManagerDataSource ds)
{
this.jdbcTemplate = new JdbcTemplate(dS);
}