Почему Environment в bean-компоненте не видит свойства из источника в контексте интеграции? - PullRequest
0 голосов
/ 18 мая 2018

В своей конфигурации веб-приложения Spring Integration я добавил заполнитель свойства:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:ctx="http://www.springframework.org/schema/context"
    ...
    xsi:schemaLocation="http://www.springframework.org/schema/context
            ...
            ">

    <ctx:component-scan ... />
    <ctx:annotation-config />
    <mvc:annotation-driven />

    <ctx:property-placeholder location="classpath:config.properties" trim-values="true" />

Это содержимое файла:

apiPath=/requests

Я уверен, что эта конфигурация работает, потому что яЯ пытался использовать это значение в http-входящем-канальном адаптере:

<int-http:inbound-channel-adapter id="/api${apiPath}"
        channel="httpRequestsChannel"
        path="${apiPath}"
        ...>
</int-http:inbound-channel-adapter>

, и если я изменю значение свойства, приложение веб-интерфейса не сможет достичь конечной точки.

Однако в дальнейшемконтекст У меня есть конечная точка, настроенная так:

<int:header-value-router input-channel="httpRequestsChannel" ... >
    <int:mapping value="POST" channel="httpRequestsPostChannel" />
    ...
</int:header-value-router>

<int:channel id="httpRequestsPostChannel" />

<int:chain input-channel="httpRequestsPostChannel">

    <int:transformer method="transform">
        <bean class="transformers.RequestToMessageFile" />
    </int:transformer>

    ...

где я хочу прочитать значение свойства:

public class RequestToMessageFile {

    @Autowired
    private Environment env;

    // ...

    public Message<?> transform(LinkedMultiValueMap<String, Object> multipartRequest) {
        System.out.println("Value: " + env.getProperty("apiPath"));

Но на консоли я вижу:

Value: null

Я предположил, что однажды объявил источник свойств в XML, который будет частью всей среды веб-приложений, что мне не хватает?Должен ли я объявить источник в другом месте?

Я заметил, что, если я добавлю следующие аннотации:

@Configuration
@PropertySource("classpath:config.properties")
public class RequestToMessageFile {

, свойство будет найдено правильно, поэтому я думаю, что это просто проблема конфигурации.

В случае, если это имеет значение, вот часть web.xml, которая настраивает интеграцию:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/META-INF/spring.integration/context.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

ОБНОВЛЕНИЕ

Частично следующий этот ответ Iудалил <ctx:property-placeholder> из файла XML, и я добавил следующий bean-компонент:

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:config.properties")
public class WebappConfig {

}

И теперь и bean-компоненты, и XML-файл могут видеть свойства.

1 Ответ

0 голосов
/ 18 мая 2018

Цитируя Мартина Дейна:

Нет, это не проблема конфигурации, которая должна работать.Не добавляет свойства в окружающую среду.Где, как это делает @PropertySource.

Поэтому вы должны удалить <ctx:property-placeholder> из вашей конфигурации XML.Продолжайте использовать @PropertySource("classpath:config.properties"), а также добавьте определение этого компонента:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

Обратите внимание, как это должно быть static Не загружайте с нетерпением все другие компоненты в том же @Configuration.

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