おはよう。 私は、1つのリーダー、コンポジットプロセッサー、コンポジットライターでステップがある春バッチプロセスに取り組んでいます。 最初のプロセッサは、データソース/ jdbcテンプレートを使用してレコードの情報を読み取り、ライターからレコードを渡すかどうかを指定します。次のプロセッサは、data source/jdbcテンプレートと同じ設定を持ち、java config bean(Spring Boot)と同じ方法で設定されますが、jdbcテンプレートがnullになります。 私は、各プロセッサにデータソース設定ツールを用意しています。この設定ツールは、すでにプロセッサに定義されているjdbcテンプレートを作成します。 プロセッサは '@JobScope'に設定されているため、コマンドラインパラメータを使用して処理中のアクションを特定できます。SpringバッチCompositeProcessor各プロセッサにはjdbcTemplateがあり、2番目のプロセッサにはnullと表示されています
JdbcTemplate jdbcTemplate;
....とセッターを使用して設定します:
@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を定義
public void setDataSource(DriverManagerDataSource dS) {
this.jdbcTemplate = new JdbcTemplate(dS);
}
第1のプロセッサが正常に動作します:私がしたときに2番目がNPEをスローする List(....)のためのクエリ "
私はまた、プロセッサー内のドライバー・マネージャー・データ・ソース・オブジェクト を使用して、 照会を実行する前に、それがヌルであると判断した場合にJdbcテンプレートを作成するために使用します。私は得ました:
java.lang.IllegalArgumentException:いいえDataSourceが指定されていません ...プロセッサ内でjdbcTemplateデータソースを設定しようとしました。
アドバイスが役に立ちます。
ありがとうございます。
おかげで、エド。あなたはjavaの設定のコンストラクタ、またはプロセッサBean自体についてお話ししていますか? –
クラス自身の定義では、コード。通常のクラスで使用する通常のコンストラクタのように、上記のようにAutowiredを一番上に置きます。 Springはそれをスキャンし、依存関係を挿入します(これはBeanとしてアノテーションされています) – Edd
私のbeanに@Autowiredを追加しました:
(autowired annot>, public class FirstProcessor \t \t \t \t \t implements ItemProcessor { \t \t private static final Logger log = LoggerFactory.getLogger(FirstProcessor.class.getName()); \t
...それは私にエラーを与えました:アノテーションのタイプはこれには当てはまりません宣言の一種。 Java 1.7、Spring 4.3.5、SpringBatch 3.0.7、SpringBoot 1.3.0、SpringBootStarterBatch 1.2.7を使用しています。 –