Spring Bean初始化 - 通过xml作为String传递的日期不适用于步骤范围

时间:2016-11-22 03:50:09

标签: java xml spring spring-mvc

我需要将currentDate作为String传递给我在subject中附加的sendMetaStatsTask tasklet。 现在,如果我使用以下xml

创建一个scope =“step”的bean
<bean id="sendMetaStatsTask" class="org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter" scope="step">
        <property name="targetObject">
            <bean class="com.nextag.catalog.springbatch.tasklets.GenerateReportFromQueriesTasklet">
                <property name="mailTo" value="#{jobParameters['MAIL_TO']}"/>
                <property name="mailFrom" value="#{jobParameters['MAIL_FROM']?:'wizereporter@nextag.com'}"/>
                <property name="mailSubject" value="#{jobParameters['PARTNER_DOMAIN']+' Affiliate Seller Report - '+ currentDate.toString()}"/>
            </bean>
        </property>
        <property name="targetMethod" value="execute"/>
    </bean>

    <bean id="fastDateFormat" class="org.apache.commons.lang.time.FastDateFormat" factory-method="getInstance">
        <constructor-arg value="dd/MM/yyyy"/>
    </bean>

    <bean id="currentDate" class="java.util.Date" factory-bean="fastDateFormat" factory-method="format" scope="step">
        <constructor-arg>
            <bean class="java.util.Date"/>
        </constructor-arg>
    </bean>

它抛出: -

  

在BeanDefinition中定义名为'currentDate'的bean时出错   在文件中定义   [/home/nextag/Apache6/tomcat/webapps/nextag/WEB-INF/classes/META-INF/spring/batch/jobs/seller-meta-stats-logging-job.xml]:   bean的初始化失败;嵌套异常是   java.lang.IllegalStateException:无法为bean创建范围代理   'scopedTarget.currentDate':无法确定目标类型   代理创建时间。           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)

但是,如果我使用原型,它可以正常工作。

需要问为什么它不在步骤范围内工作,我错过了什么?

1 个答案:

答案 0 :(得分:3)

您需要告诉bean currentDate范围代理,以便任何注入仅对范围步骤有效。 A good explanation is here

<bean id="fastDateFormat" class="org.apache.commons.lang.time.FastDateFormat" factory-method="getInstance">        
        <constructor-arg value="dd/MM/yyyy"/>
    </bean>

    <bean id="currentDate" class="java.util.Date" factory-bean="fastDateFormat" factory-method="format" scope="step">
        <aop:scoped-proxy/>
        <constructor-arg>
            <bean class="java.util.Date"/>
        </constructor-arg>
    </bean>