Spring Boot + Spring Batch: setIgnoreUnresolvablePlaceholder не работает с гибридным приложением (XML + аннотации) - PullRequest
0 голосов
/ 30 апреля 2020

Фон

В настоящее время я работаю над переносом устаревшего приложения 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
  1. Если я удаляю @ImportResource и PropertySourcesPlaceholderConfigurer, моя работа выполняется отлично.
  2. Если я удаляю PropertySourcesPlaceholderConfigurer, но сохраняю @ImportResource для импорта моей конфигурации XML spring, Spring начинает жаловаться на отсутствие свойств в XML config.
  3. Если я сохраню оба @ImportResource для импорта конфигурации XML и PropertySourcesPlaceholderConfigurer, я получу вышеуказанное исключение.

Как я могу вызовите setIgnoreUnresolvablePlaceholder в гибридном приложении Spring Boot, так как меня не волнует загрузка определенных бинов с правильными свойствами, особенно из файла конфигурации бина XML, который я не могу изменить?

Примечание : Я добавил spring.main.allow-bean-definition-overriding=true в мои application.properties, чтобы я мог переопределить автоматически настроенные bean-компоненты, созданные Spring Boot, такие как использование репозитория заданий на основе карты вместо запись метаданных задания в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...