Tengo un trabajo que tiene que ejecutar varias veces con diferentes parámetros de trabajo. Quiero configurar un JdbcCursorItemReader a realizar una consulta para el trabajo, la itemReader está configurado de esta forma:

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

y el trabajo está configurado de esta forma:

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

La parameterSetter es casi mínima:

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

Esto es usando la primavera-lote 2.1.8.

¿Cómo puedo obtener el parámetro del trabajo en la consulta?

Creo que estoy cerca, he intentado cambiar el parámetro definidor de configuración para:

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

pero me sale este error:

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

He encontrado una muy similar pregunta, la diferencia entre uno y este es que no tengo un lector de clase para anotar, sólo tengo el xml de entrada porque me gustaría evitar tener que crear mi propio itemReader. (Yo podría tratar de reemplazar el jdbcCursorItemReader clase sólo para ser capaz de anotar…)

1 Comentario

  1. 3

    Todo lo que hizo fue agregar el atributo scope en el parameterSetter clase:

        <bean class="com.initech.reports.tps.ParameterSetter"
            scope="step">
            <constructor-arg value="#{jobParameters['myParam']}"/>
        </bean>
    • +1 he portado mi configuración de XML basado en anotaciones y se olvidó de traer el scope="step" como @Scope("step").
    • Nathan, ¿de Dónde escribió SQL & donde se debe configurar el parámetro value value=»#{jobParameters[‘myParam’]}»..por favor, Puedes compartirlo..

Dejar respuesta

Please enter your comment!
Please enter your name here