2017-03-27 4 views
0

おはよう。 私は、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データソースを設定しようとしました。

アドバイスが役に立ちます。
ありがとうございます。

答えて

0

コンストラクタで@Autowiredを使用して、インスタンスが作成される前に挿入する依存性をSpringがスキャンするようにすることができます。

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

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

おかげで、エド。あなたはjavaの設定のコンストラクタ、またはプロセッサBean自体についてお話ししていますか? –

+0

クラス自身の定義では、コード。通常のクラスで使用する通常のコンストラクタのように、上記のようにAutowiredを一番上​​に置きます。 Springはそれをスキャンし、依存関係を挿入します(これはBeanとしてアノテーションされています) – Edd

+0

私の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を使用しています。 –

関連する問題