java - 如何通过 Spring-Expression-Language 或其他方式根据 jobParameters 有条件地注入(inject) bean?

标签 java spring spring-batch spring-expression-language

我正在尝试创建一个包含多个 FlatFileItemWriter 的 CustomWriter。 配置是通过xml。 我希望根据 jobParameters 中的值将 FlatFileItemWriters 注入(inject)到 CustomWriter 中;像这样-

<bean id="customWriter" class="com.company.writer.CustomDataWriter" scope="step">
    <property name="chapatiDataWriter" ref="#{jobParameters['chapatiSection'] != null ? chapatiDataWriter : null}"/>
    <property name="anotherDataWriter" ref="anotherDataWriter"/>
    <property name="batchJobConfiguration" value="#{jobParameters['product_configuration']}"/>
</bean>

当我尝试运行该应用程序时,我得到;

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.customWriter' defined in URL [file:./conf/context.xml]: Cannot resolve reference to bean '#{jobParameters['chapatiSection'] != null ? chapatiDataWriter : null}' while setting bean property 'chapatiDataWriter'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.batch.item.file.FlatFileItemWriter@19cb8309' available

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.batch.item.file.FlatFileItemWriter@19cb8309' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:805)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1279)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:297)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)
    ... 52 common frames omitted

如何根据 jobParameters 有条件地注入(inject) chapatiDataWriter?

最佳答案

尽管 SpEL 非常强大,但我不建议在字符串中使用复杂的代码。我将使用 FactoryBean 创建自定义编写器并在 XML 配置中使用工厂 bean:

<bean id="customWriter" class="com.company.writer.CustomDataWriterFactoryBean" scope="step"/>

关于java - 如何通过 Spring-Expression-Language 或其他方式根据 jobParameters 有条件地注入(inject) bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61800129/

相关文章:

spring - Spring Batch "default"上下文变量是什么?

java - 用MySQL玩转2框架spring data

java - 循环不会中断并且始终显示无效输入

java - 接口(interface) com.sun.xml.ws.developer.WSBindingProvider 在类加载器中不可见

java - 工厂方法中的链接方法

java - 关闭 Kafka 消费者

java - 向服务器发送大量文本的更好方法?

java - 充气类时出错?

java - Spring批MySql序列 "Could not obtain last_insert_id()"重新保护引擎类型

java - 初始化读取器在 Spring 批处理中的一步失败