Фон
В настоящее время я работаю над переносом устаревшего приложения Spring в Spring Boot и архитектуру Microservices. Я разбиваю свое приложение на более мелкие микросервисы на основе бизнес-функций и данных, на которых они работают.
В моем устаревшем приложении используются конфигурации XML, и теперь я извлек некоторые бизнес-функции из этого приложения в отдельный проект Spring Boot. Существуют определенные файлы конфигурации XML Spring, которые я не могу сразу переместить в аннотации, поскольку они принадлежат другой команде. Это означает, что мой проект Spring Boot должен импортировать эти XML файлы конфигурации Spring до тех пор, пока они сами не будут перемещены в Spring Boot.
Код:
Мой основной класс:
@SpringBootApplication
@ImportResource(locations = { "classpath:spring/interest-forecasting.xml" })
public class InterestRatesApplication {
public static void main(String[] args) {
SpringApplication.run(InterestRatesApplication .class, args);
}
}
Класс конфигурации моей партии (только для соответствующих частей):
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job interestRatesDataLoadJob(DataSource dataSource,
InterestRatesCacheWriter writer,
ArgumentPreparedStatementSetter argumentPreparedStatementSetter,
InteresrRatesCahceDataLoadListener listener) {
//code to assemble to job
}
@Bean
public JobRepository jobRepository() throws Exception {
ResourcelessTransactionManager transactionManager = new ResourcelessTransactionManager();
MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(
transactionManager);
mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);
return mapJobRepositoryFactoryBean.getObject();
}
@Bean
public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(jobRepository);
return simpleJobLauncher;
}
}
Проблема
Прогнозирование процентов. xml имеет множество компонентов, которые ссылаются на некоторые свойства с использованием синтаксиса ${property.name}
, который меня не интересует в процентных ставках microservice. Мне нужно всего несколько бобов из этого xml файла. Я подумал о переопределении PropertySourcesPlaceholderConfigurer и добавил следующий код в основной класс:
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
return propertySourcesPlaceholderConfigurer;
}
Это приводит к следующему исключению:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'batchConfiguration': Unsatisfied dependency expressed through field 'jobBuilderFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobBuilders' defined in class path resource [org/springframework/batch/core/configuration/annotation/SimpleBatchConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.core.configuration.annotation.JobBuilderFactory]: Factory method 'jobBuilders' threw exception; nested exception is java.lang.ClassCastException: org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean$$EnhancerBySpringCGLIB$$2bfb173 cannot be cast to org.springframework.batch.core.repository.JobRepository
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5
- Если я удаляю
@ImportResource
и PropertySourcesPlaceholderConfigurer
, моя работа выполняется отлично. - Если я удаляю
PropertySourcesPlaceholderConfigurer
, но сохраняю @ImportResource
для импорта моей конфигурации XML spring, Spring начинает жаловаться на отсутствие свойств в XML config. - Если я сохраню оба
@ImportResource
для импорта конфигурации XML и PropertySourcesPlaceholderConfigurer
, я получу вышеуказанное исключение.
Как я могу вызовите setIgnoreUnresolvablePlaceholder в гибридном приложении Spring Boot, так как меня не волнует загрузка определенных бинов с правильными свойствами, особенно из файла конфигурации бина XML, который я не могу изменить?
Примечание : Я добавил spring.main.allow-bean-definition-overriding=true
в мои application.properties, чтобы я мог переопределить автоматически настроенные bean-компоненты, созданные Spring Boot, такие как использование репозитория заданий на основе карты вместо запись метаданных задания в базу данных.