2012-10-11 3 views
2

J'ai un travail qui doit être exécuté plusieurs fois avec des paramètres de travail différents. Je veux mettre en place un JdbcCursorItemReader pour effectuer une requête pour le travail, le itemReader est configuré comme ceci:Utilisation d'un paramètre de travail en tant que paramètre d'instruction préparée dans un 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> 

et le travail est configuré comme ceci:

<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> 

Le parameterSetter est assez minime:

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); 
    } 
} 

Ceci utilise le mélange de printemps 2.1.8.

Comment puis-je obtenir le paramètre de travail dans la requête?

Je pense que je suis proche, j'ai essayé de changer le setter paramètre config:

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

mais je reçois cette erreur:

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 

J'ai trouvé a very similar question, la différence entre celui-là et c'est que je n'ai pas de classe de lecteur à annoter, j'ai juste l'entrée xml parce que je voudrais éviter de devoir créer mon propre itemReader. (Je pourrais essayer la classe jdbcCursorItemReader remplaçant juste pour pouvoir annoter ...)

Répondre

3

Il a suffi d'ajouter le champ d'attribut sur la classe parameterSetter:

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

+1 Je Ported ma config de XML à annotation-based et a oublié d'apporter '' '' scope = "step" '' 'over as' '' @Scope ("step") '' '. – opyate

+1

Nathan, Où avez-vous écrit SQL et où devez-vous configurer valeur de valeur = "# {jobParameters ['myParam']}" .. Pouvez-vous s'il vous plaît le partager .. – DEADEND

Questions connexes