【问题标题】:Using a job parameter as a prepared statement parameter in a JdbcCursorItemReader在 JdbcCursorItemReader 中使用作业参数作为准备好的语句参数
【发布时间】:2012-10-11 19:43:05
【问题描述】:

我的工作必须使用不同的工作参数多次运行。我想设置一个 JdbcCursorItemReader 来执行作业查询,itemReader 配置如下:

<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 类只是为了能够对其进行注释......)

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    只需将 scope 属性添加到 parameterSetter 类:

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

    【讨论】:

    • +1 我将我的配置从 XML 移植到基于注解的配置,但忘记将 scope="step" 转换为 @Scope("step")
    • Nathan,你在哪里写的 SQL & 应该在哪里配置参数值 value="#{jobParameters['myParam']}"..你能分享一下吗..
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多