2012-10-11 45 views
2

我有一個作業需要多次使用不同的作業參數運行。我想建立一個JdbcCursorItemReader執行作業的查詢時,itemReader配置是這樣的:將作業參數用作JdbcCursorItemReader中的預準備語句參數

<bean id="tpsItemReader" 
    class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="sql" value="#{sqlQueries['tps.findStuffforSomeSubset']}"/> 
    <property name="preparedStatementSetter"> 
     <bean class="com.initech.reports.tps.ParameterSetter"> 
      <!-- can't hardcode this, I want a job parameter here --> 
      <constructor-arg value="A"/> 
     </bean> 
    </property> 
    <property name="rowMapper"> 
     <bean class="com.initech.reports.tps.CustomerRowMapper"/> 
    </property> 
</bean> 

和作業配置是這樣的:

<batch:job id="tpsReportJob"> 
    <batch:step id="tpsReportJob.generateReport"> 
     <batch:tasklet> 
      <batch:chunk reader="tpsItemReader" 
      processor="tpsItemProcessor" 
      writer="tpsItemWriter" commit-interval="100000"/> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

的parameterSetter是相當小:

package com.initech.reports.tps; 

import java.sql.PreparedStatement; 
import java.sql.SQLException; 

import org.springframework.jdbc.core.PreparedStatementSetter; 

public class ParameterSetter implements PreparedStatementSetter { 

    private final String x; 

    public ParameterSetter(String x) {this.x = x;} 

    @Override 
    public void setValues(PreparedStatement ps) throws SQLException { 
     ps.setString(1, x); 
    } 
} 

這是使用spring-batch 2.1.8。

如何獲取作業參數到查詢中?

我想我接近,我試圖改變參數設置器配置到:

 <bean class="com.initech.reports.tps.ParameterSetter"> 
      <constructor-arg value="#{jobParameters['myParam']}"/> 
     </bean> 

,但我得到這個錯誤:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' 
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:208) 
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:72) 
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52) 
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:93) 
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:88) 
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:139) 
    ... 51 more 

我發現a very similar question,一個和之間的區別這是我沒有讀者類來註釋,我只是有xml條目,因爲我想避免必須創建我自己的itemReader。 (我可以嘗試重寫jdbcCursorItemReader類只是爲了能夠進行註解...)

回答

3

時採取了增加scope屬性到parameterSetter類:

<bean class="com.initech.reports.tps.ParameterSetter" 
     scope="step"> 
     <constructor-arg value="#{jobParameters['myParam']}"/> 
    </bean> 
+1

+1我移植我的配置從XML以註解爲基礎,並忘記將'''scope =「step」'''作爲'''@Scope(「step」)'''。 – opyate

+1

Nathan,你在哪裏寫了SQL&where應該配置參數值=「#{jobParameters ['myParam']}」..你可以請分享它.. – DEADEND

相關問題