Почему Environment в bean-компоненте не видит свойства из источника в контексте интеграции?
В конфигурации веб-приложения 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 inbound-channel-adapter:
<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>
ОБНОВИТЬ
Частично после этого ответа я удалил <ctx:property-placeholder>
из файла XML, и я добавил следующий компонент:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:config.properties")
public class WebappConfig {
}
И теперь оба компонента и XML-файл могут видеть свойства.
1 ответ
Цитируя Мартина Дейна:
Нет, это не проблема конфигурации, которая должна работать. Не добавляет свойства в окружающую среду. Где, как это делает @PropertySource.
Поэтому вы должны удалить <ctx:property-placeholder>
из вашей конфигурации XML. Продолжайте использовать @PropertySource("classpath:config.properties")
а также добавьте это определение компонента:
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Обратите внимание, как это должно быть static
не загружайте с нетерпением все другие бобы в том же @Configuration
,