最近遇到了使用多个 < 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>
运行测试示例(不启用任一配置文件)spring 会提示为 id“job”找到了多个注释。有任何想法吗 ?
最佳答案
我遇到了同样的问题,那是因为 spring XML 验证器。如您所知,当您创建 spring xml 文件时,首先 spring 将此文件发送到 XML 解析器以对其进行验证。
我的意思是你可以定义两个或多个具有相同 id 的 bean。然后你可以看到 spring XML 验证器解析你的 XML 文件没有任何问题。尽管在后期阶段,如果这些 bean 处于相同的配置文件中或不在任何配置文件中,spring 本身会抛出异常。
但是 在 spring 批处理中,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>
关于Spring Batch 和 Spring3.1 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906601/