【问题标题】:How do I load a bean value from a file with job parameter substitution?如何使用作业参数替换从文件中加载 bean 值?
【发布时间】:2012-08-06 20:59:27
【问题描述】:

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

<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="" 属性中一样。

有什么好的方法吗?

【问题讨论】:

    标签: java spring spring-batch


    【解决方案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}} 是有效的。

    【讨论】:

    • 对不起,符号#{jobParameters['arg1']}实际上是一个spring批处理的东西。这个问题更多地涉及如何获取属性值解析以应用于外部 txt 文件中的内容并将其用作 bean 的值。
    【解决方案2】:

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

    像这样:

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


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

    【讨论】:

      【解决方案3】:

      如果有人来这里是为了从属性文件中执行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>

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

      ${myPropFromFile}

      祝大家批处理愉快 ;-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 2019-04-09
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多