Как я могу условно ввести bean-компонент в зависимости от параметров задания через Spring-Expression-Language или иначе?
Я пытаюсь создать CustomWriter, содержащий несколько FlatFileItemWriter. Конфигурация по xml. Я хочу, чтобы FlatFileItemWriters вводились в CustomWriter в зависимости от значений в jobParameters; Нравится-
<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
Как условно ввести chapatiDataWriter в зависимости от параметров jobParameters?
1 ответ
Несмотря на то, что SpEL очень мощный, я не рекомендую использовать сложный код в строках. Я бы использовалFactoryBean
для создания настраиваемого модуля записи и использования фабричного компонента в конфигурации XML:
<bean id="customWriter" class="com.company.writer.CustomDataWriterFactoryBean" scope="step"/>