如何从具有作业参数替换的文件加载bean值?

时间:2012-08-06 20:59:28

标签: java spring spring-batch

在我的春季批处理项目中,我可以这样做:

<bean id="exampleTasklet" class="my.custom.Tasklet">
    <property name="message" value="job parameter value: #{jobParameters['arg1']}"/>
</bean>

并且message属性将具有从spring批处理作业参数中获取的值。但是,我实际想要分配的值非常大,我不想将它放在xml文件中。我知道这种语法不起作用,但我想做类似的事情:

<bean id="exampleTasklet" class="my.custom.Tasklet">
    <property name="message" read-value-from-file="/path/to/file.txt"/>
</bean>

并且该文件将包含“作业参数值:#{jobParameters ['arg1']}”行,弹出将解析为文件内容位于value =“”属性中。

有一个很好的方法吗?

3 个答案:

答案 0 :(得分:1)

我认为你要找的是PropertyPlaceholderConfigurer

<bean  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <property name="location" value="/path/to/file.properties" /> 
    <property name="placeholderPrefix" value="#{" /> 
    <property name="placeholderSuffix" value="}" /> 
</bean>

这是由Spring作为bean处理器运行的,并将尝试解析占位符令牌。有一个默认实例将使用以下表示法解析系统属性:${propertyname}。为了您的注释,您需要指定placeholderPrefix / Suffix。当有多个bean处理器时,顺序由order属性确定。默认情况下,如果处理器无法解析占位符,则执行失败,但可以通过设置ignoreUnresolvablePlaceholders来更改。由于该机制是属性驱动的,因此您可能需要考虑如下符号:

<property name="message" value="job parameter value: #{jobParameters.arg1}"/>

或者,如果您要传达的是arg1也是参数,您可以尝试:

<property name="message" value="job parameter value: #{jobParameters.${arg1}}"/>

Spring循环遍历bean处理器,直到不执行替换,或引发异常。因此,将属性定义为${something.${orOther}}是有效的。

答案 1 :(得分:0)

我建议您使用String作为文件名,并在bean中打开该文件 我不确定我的问题是否正确。我只是建议像Spring MessageBundle 这样的东西
这样的事情:

<bean id="exampleTasklet" class="my.custom.Tasklet">
    <property name="messagePath" location="/path/to/file.txt"/>
</bean>


在你的exampleTasklet中阅读文件并做你的事(我不确定它是什么)

答案 2 :(得分:0)

如果有人来这里从属性文件中做this之类的事情:

如果您希望.properties文件中的属性显示在JobParameters中,您将找不到现成的解决方案。您可以执行以下操作:

  1. 在您的属性文件周围包裹bean。
  2. 将此bean传递给另一个可以访问JobParameters的bean,并可以将文件中的属性泵入该类。
  3. 然后你应该能够使用Spring的表达式语言访问你的属性并执行以下操作: <bean id="myBean" class="my.custom.Bean"> <property name="prop" value="#{jobParameters['arg1']}"/> </bean>
  4. 或者,我认为Devon_C_Miller提出的解决方案要容易得多。您的JobParameters中没有属性。但是,如果XML配置中的替换是您唯一需要的,则只需将占位符更改为:

      

    $ {myPropFromFile}

    快乐批处理,每个人; - )