0

在我的春季批处理项目中,我可以执行以下操作:

<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']}”,spring 将解析该行,就好像文件内容在 value="" 属性中一样。

有没有很好的方法来做到这一点?

4

3 回答 3

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}}是有效的。

于 2012-08-06T21:34:57.613 回答
0

如果有人从属性文件来这里做这样的事情:

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

  1. 在属性文件周围包裹一个 bean。
  2. 将此 bean 传递给另一个可以访问的 bean,JobParameters并且可以将文件中的属性泵入该类。
  3. 然后您应该能够使用 Spring 的表达式语言访问您的属性并执行以下操作: <bean id="myBean" class="my.custom.Bean"> <property name="prop" value="#{jobParameters['arg1']}"/> </bean>

或者,我认为 Devon_C_Miller 提出的解决方案要容易得多。你JobParameters当时没有这些属性。但是,如果 XML 配置中的替换是您唯一想要的,您只需将占位符更改为:

${myPropFromFile}

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

于 2013-03-14T09:23:12.657 回答
0

我建议您使用字符串作为文件名并在您的 bean 中打开该文件。
我不确定我是否解决了您的问题。我只是建议像 Spring MessageBundle

这样的东西:

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


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

于 2012-08-07T05:52:34.747 回答