Компонент Spring в классе конфигурации не подключается автоматически к компоненту, определенному в файле. xml - PullRequest
1 голос
/ 08 мая 2020

У меня есть класс конфигурации, в котором я создаю компонент, который использую в другом компоненте, объявленном в файле xml. Когда я пытаюсь использовать его из определенного xml bean-компонента, он выдает NPE, потому что он никогда не был автоматически подключен. Я просканировал пакет, в котором я автоматически подключаю бин конфигурации, но даже при этом не принимаю его.

MyPropertyPlaceholderConfigurer.java

package org.util;

public class MyPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

    @Autowired
    private FileBasedConfigurationBuilder<FileBasedConfiguration> propertiesConfigurationBuilder;

    @Override
    protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
        super.processProperties(beanFactoryToProcess, props);
        //breaks due to NPE
        FileBasedConfiguration configuration = propertiesConfigurationBuilder.getConfiguration();
    }
}

applicationContext.xml

    <bean id="myBean" class="org.util.MyPropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <ref bean="appProps" />
            </list>
        </property>
    </bean>

    <context:component-scan base-package="org.util" />

PropertiesFileConfiguration.java

package org.configuration;

@Configuration
public class PropertiesFileConfiguration {
    @Bean
    public FileBasedConfigurationBuilder<FileBasedConfiguration> propertiesConfigurationBuilder() {
        PropertiesBuilderParameters properties = new Parameters().properties();
        properties.setFileName("application.properties");

        FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
                new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class);
        builder.setAutoSave(true);

        return builder.configure(properties);
    }
}

Я использую Spring 4.3.26. НЕ использует SpringBoot.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Вы также можете попробовать указать требуемую зависимость autowire в своем XML вместо этого:

Если вы добавите установщик publi c для propertiesConfigurationBuilder в MyPropertyPlaceholderConfigurer, в своем XML вы можете укажите bean-компонент компоновщика конфигурации в качестве аргумента установки для вашего bean-компонента-заполнителя свойств, например (ref - имя вашего bean-компонента, name - поле, которое необходимо установить):

<bean id="myBean" class="org.util.MyPropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <ref bean="appProps" />
            </list>
        </property>
        <property name="propertiesConfigurationBuilder" ref="propertiesConfigurationBuilder" />
    </bean>
1 голос
/ 08 мая 2020

Попробуйте этот @ComponentScan («поместите сюда свой базовый пакет») для своего класса конфигурации

...