如何在范围步骤中设置conf弹簧bean中的参数

时间:2015-12-09 15:40:35

标签: spring

我的工作:

<bean class="com....JpaPagingItemReader">
    <property name="queryString" 
        value="SELECT toto FROM MyToto toto WHERE toto.createDate > :calculDate"/>
    <property name="parameterValues">
        <map>
            <entry key="calculDate" value-ref="calculDate" />
        </map>
    </property>
    <property name="pageSize" value="${totoStep.pageSize}"/>
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="calculDate" factory-bean="dates" factory-method="getDate" scope="step">
    <constructor-arg type="java.lang.String" value="totoStep"/>
</bean>

产生此错误:

  

java.lang.IllegalArgumentException:参数值[Sat Nov 01 00:00:00 CET 2014]不匹配类型[java.util.Date]

我有一个弹簧组件Dates包含Map<String, Date>我可以使用getDate(String)方法访问。
当我记录参数时:

LOGGER.trace("query.setParameter({}:String, {}:{})", me.getKey(), 
    me.getValue(), me.getValue().getClass().getSimpleName());

显示:

  

JpaPagingItemReader:167 - query.setParameter(calculDate:String,Sat Nov 01 00:00:00 CET 2014:$ Proxy36)

请帮帮我。

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。但另一个是受欢迎的。 在我的情况下,没有必要在范围步骤。我可以:

<bean id="calculDate" factory-bean="dates" factory-method="getDate" 
    lazy-init="true">
    <constructor-arg type="java.lang.String" value="totoStep"/>
</bean>

感谢此人知道如何在范围步骤中设置所有对象上的$ Proxy并强制我们使用接口(在这种情况下不可能)。

答案 1 :(得分:0)

您必须使用spring language expression来获取所需的值。

<bean class="com....JpaPagingItemReader">
    <property name="queryString" 
        value="SELECT toto FROM MyToto toto WHERE toto.createDate > :calculDate"/>
    <property name="parameterValues">
        <map>
            <entry key="calculDate" value="#{dates.date['totoStep']}" />
        </map>
    </property>
    <property name="pageSize" value="${totoStep.pageSize}"/>
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>