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

Posted

技术标签:

【中文标题】Spring Bean初始化-通过xml作为字符串传递的日期不适用于步骤范围【英文标题】:Spring Bean initialization - Date passed as String via xml not working for step scope 【发布时间】:2017-04-05 15:11:35 【问题描述】:

我需要将 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)

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

需要询问为什么它不能在 step 范围内工作,我是否遗漏了什么?

【问题讨论】:

【参考方案1】:

您需要告诉 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>

【讨论】:

抱歉回复晚了,我很忙。我认为此解决方案不起作用,因为在这里我将单例 bean 注入到 step-scope bean 中,该 bean 在实例化范围 bean 时应该可用。

以上是关于Spring Bean初始化-通过xml作为字符串传递的日期不适用于步骤范围的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习笔记5 - Bean定义继承

Spring 初始化bean之前,销毁bean之前

Spring从容器中获取bean对象可以分别通过啥接口

Spring从容器中获取bean对象可以分别通过啥接口?

Spring实战读书笔记Spring装配Bean

Spring实战读书笔记Spring装配Bean