2017-02-02 11 views
0

Интересно, как передать параметр bean.xml.Параметры прохода в данных весны

Если я пишу, как это в bean.xml, он работает, как ожидалось

<bean id="notificationReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step"> 
     <property name="dataSource" ref="dataSource" /> 
    <property name="sql" value="SELECT r.EDCBATCH_OPEN_DATETIME As openDate FROM rev_acq_edcbatch r WHERE r.EDCBATCH_STATUS ='A'" /> 
    <property name="rowMapper"> 
    <bean name = "campaignMapper" class="rh.com.app.domain.AgingMapper"> 
      </bean> 
     </property> 
    </bean> 

Но если я пишу, как это, я получаю ошибку

<property name="sql" value="SELECT r.EDCBATCH_OPEN_DATETIME As openDate FROM rev_acq_edcbatch r WHERE r.EDCBATCH_STATUS = #{jobParameters['edcbatchStatus']}" /> 

Мой bean.xml

<task:scheduled-tasks> 
      <task:scheduled ref="agingScheduler" method="run" cron="*/5 * * * * *" /><!--0 0 5 * * *--> 
     </task:scheduled-tasks> 

<!--  class = bean--> 
    <bean id="agingScheduler" class="rh.com.ap.AgingScheduler"> 
     <property name="jobLauncher" ref="jobLauncher" /> 
     <property name="agingJob" ref="agingJob" /> 
     <property name="mailClient" ref="mailClient" /> 
    </bean> 


    <batch:job id="agingJob"> 
     <batch:step id="step1" next = "emailFile" > 
       <batch:tasklet transaction-manager="transactionManager"> 
        <batch:chunk reader="notificationReader" writer="notificationWriter" processor="notificationProcessor" commit-interval="10" /> 
       </batch:tasklet> 
      </batch:step> 
      <batch:step id="emailFile"> 
       <batch:tasklet ref="emailTasklet" /> 
      </batch:step> 

      <batch:listeners> 
       <batch:listener ref="jobListener" /> 
      </batch:listeners> 
     </batch:job> 

AgingScheduler

JobParametersBuilder builder = new JobParametersBuilder(); 
      builder.addDate("date", new Date()); 
      builder.addString("fileName", "AgingReporting_" + PropertiseUtil.settlementDateyyyyMMdd()); 
      builder.addString("edcbatchStatus","A").toJobParameters(); 

Ошибка

Job failed with following exceptions 
exception :Failed to initialize the reader 

ответ

1

Здравствуйте Джон,

Вы можете создать подкласс JdbcCursorItemReader где вы установили # {jobParameters [ 'edcbatchStatus']} в качестве отдельного параметра. И затем используйте Springs InitializingBean, чтобы установить свойство Sql. Как насчет чего-то подобного?

class EdcBatchStatusItemReader extends  org.springframework.batch.item.database.JdbcCursorItemReader implements 
org.springframework.beans.factory.InitializingBean { 

    protected String batchStatus; 

    public void getBatchStatus(String batchStatus) { 
      this.batchStatus = batchStatus; 
    } 

    public void afterPropertiesSet() { 
     setSql("SELECT r.EDCBATCH_OPEN_DATETIME As openDate FROM rev_acq_edcbatch r WHERE r.EDCBATCH_STATUS ='" + batchStatus + "'"); 
    } 

} 

, а затем оставить SqL из определения фасоли и использовать setBatchStatus вместо:

<bean id="notificationReader" class="EdcBatchItemReader" scope="step"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="batchStatus" value="#{jobParameters['edcbatchStatus']}" /> 
    <property name="rowMapper"> 
     <bean name = "campaignMapper" class="rh.com.app.domain.AgingMapper"> 
     </bean> 
    </property> 
</bean> 

С наилучшими пожеланиями Марк

+0

Спасибо Marc :). –

0

PS причина ваш код не работает в том, что весна думает # {jobParameters ['edcbatchStatus']} является частью SQL и не интерпретирует его. Если вы передадите его как полное значение поля, он должен работать, если предположить, что синтаксис верен.