在我的春季批处理项目中,我可以这样做:
<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 =“”属性中。
有一个很好的方法吗?
答案 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
中,您将找不到现成的解决方案。您可以执行以下操作:
JobParameters
的bean,并可以将文件中的属性泵入该类。<bean id="myBean" class="my.custom.Bean">
<property name="prop" value="#{jobParameters['arg1']}"/>
</bean>
或者,我认为Devon_C_Miller提出的解决方案要容易得多。您的JobParameters
中没有属性。但是,如果XML配置中的替换是您唯一需要的,则只需将占位符更改为:
$ {myPropFromFile}
快乐批处理,每个人; - )