Spring Batch和Spring3.1配置文件

mag*_*lla 5 spring profiles spring-batch

最近面临的问题是,使用多个<beans>定义的spring 3.1启用的配置文件功能不适用于spring批次自有标记.

<beans profile="prod">
    <bean id ="test" class="java.lang.String"></bean>
    <batch:job id="job" abstract="true" >
     <batch:listeners>

        <batch:listener ref="jobExecutionContextDateSetter" />
        <batch:listener ref="jobStatusListener"/>
      </batch:listeners>
    </batch:job>
</beans>

<beans profile="dev">
    <bean id ="test" class="java.lang.String"></bean>
    <batch:job id="job" abstract="true" >
      <batch:listeners>
          <batch:listener ref="jobExecutionContextDateSetter" />
       </batch:listeners>
    </batch:job>
</beans>
Run Code Online (Sandbox Code Playgroud)

运行测试示例(没有启用任何一个配置文件)spring抱怨找到id"job"的多个注释.有任何想法吗 ?

Gat*_*Gat 2

我遇到了同样的问题,那是因为 spring XML 验证器。正如您所知,当您创建 spring xml 文件时,spring 首先将此文件发送到 XML 解析器以验证它。

我的意思是你可以定义两个或多个具有相同 id 的 bean。然后你可以看到 spring XML 验证器解析你的 XML 文件没有任何问题。尽管在后期阶段,如果这些 bean 位于同一配置文件中或不在任何配置文件中,则 spring 本身会抛出异常。

但是在 Spring Batch 中,XML 验证器不允许两个作业具有相同的 id。

解决方案是,您可以从任何配置文件中定义批次,并在配置文件中定义其 bean,如下所示:

<batch:job id="job1" abstract="true" job-repository="jobRepository">
        <batch:listeners>
            <batch:listener ref="jobListener"/>
        </batch:listeners>
</batch:job>

<beans profile="prod">
        <bean id="jobListener" class="com.batch.ProductionJobListener"/>
</beans>

<beans profile="dev">
    <bean id="jobListener" class="com.batch.DevelopmentJobListener"/>
</beans>
Run Code Online (Sandbox Code Playgroud)