CXF / @ImportResource 与 PropertySourcesPlaceholderConfigurer
CXF / @ImportResource vs. PropertySourcesPlaceholderConfigurer
我无法将 @ImportResource
与 PropertySourcesPlaceholderConfigurer
结合使用。我能找到的最接近的是 this question,但我不明白如何让它为我工作。
这是我的配置 class:
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableWebMvc
@EnableScheduling
@EnableAsync
@ImportResource("classpath:/config/webservices.xml")
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer properties(Environment environment) throws IOException {
String env = StringUtils.defaultIfBlank(environment.getProperty("env"), "local");
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
Resource[] allResources = generateListOfPropertiesFiles(env);
configurer.setLocations(allResources);
configurer.setIgnoreResourceNotFound(true);
return configurer;
}
:
}
由于我们的配置文件设置,我需要这种相当复杂的方法。
提到的 /config/webservices.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:client id="sessionControl"
serviceClass="com.service.schemas.work1_2.SessionControl" address="${endpoint.sessionControl}">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:client>
</beans>
endpoint.sessionControl
在 .properties
文件之一中定义。
据我所知,XML 在 PropertySourcesPlaceholderConfigurer
存在之前被解析和评估,因此,没有任何代码可以替换占位符。但是,如何让 Spring 的内部理解它应该在读取所有属性后解析 XML?使用 @ImportResource
是否正确?我需要向 Spring 提供什么?还是有一个相当简单的技巧来让它工作?
我在 Spring 的这一部分对 bean 生命周期和 bean 工厂相当陌生,我总是很惊讶它们如何很好地工作(好吧,通常).. .
--编辑--
我一直在尝试在@PostConstruct 中设置地址,但我无法让它工作。它总是回到 "${...}":
@Inject
private SessionControl sessionControl;
@Value("${endpoint.sessionControl}")
private String endpointSessionControl;
@PostConstruct
public void postConstruct() {
((Client) sessionControl).getConduit().getTarget().getAddress().setValue(endpointSessionControl);
((Client) sessionControl).getEndpoint().getEndpointInfo().setAddress(endpointSessionControl);
}
哈,成功了! :)
我所要做的就是遵循CXF-documentation for Spring。底部是 "Create a Client (More Manual Way)" 部分。换句话说,我的 /config/webservices.xml
现在是 Java @Bean
s:
@Value("${endpoint.sessionControl}")
private String endpointSessionControl;
@Bean
public SessionControl sessionControl() {
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setServiceClass(SessionControl.class);
jaxWsProxyFactoryBean.setAddress(endpointSessionControl);
jaxWsProxyFactoryBean.setFeatures(Arrays.asList(new LoggingFeature()));
return (SessionControl) jaxWsProxyFactoryBean.create();
}
希望这样实例化JaxWsProxyFactoryBean
没问题
我无法将 @ImportResource
与 PropertySourcesPlaceholderConfigurer
结合使用。我能找到的最接近的是 this question,但我不明白如何让它为我工作。
这是我的配置 class:
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableWebMvc
@EnableScheduling
@EnableAsync
@ImportResource("classpath:/config/webservices.xml")
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer properties(Environment environment) throws IOException {
String env = StringUtils.defaultIfBlank(environment.getProperty("env"), "local");
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
Resource[] allResources = generateListOfPropertiesFiles(env);
configurer.setLocations(allResources);
configurer.setIgnoreResourceNotFound(true);
return configurer;
}
:
}
由于我们的配置文件设置,我需要这种相当复杂的方法。
提到的 /config/webservices.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:client id="sessionControl"
serviceClass="com.service.schemas.work1_2.SessionControl" address="${endpoint.sessionControl}">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:client>
</beans>
endpoint.sessionControl
在 .properties
文件之一中定义。
据我所知,XML 在 PropertySourcesPlaceholderConfigurer
存在之前被解析和评估,因此,没有任何代码可以替换占位符。但是,如何让 Spring 的内部理解它应该在读取所有属性后解析 XML?使用 @ImportResource
是否正确?我需要向 Spring 提供什么?还是有一个相当简单的技巧来让它工作?
我在 Spring 的这一部分对 bean 生命周期和 bean 工厂相当陌生,我总是很惊讶它们如何很好地工作(好吧,通常).. .
--编辑--
我一直在尝试在@PostConstruct 中设置地址,但我无法让它工作。它总是回到 "${...}":
@Inject
private SessionControl sessionControl;
@Value("${endpoint.sessionControl}")
private String endpointSessionControl;
@PostConstruct
public void postConstruct() {
((Client) sessionControl).getConduit().getTarget().getAddress().setValue(endpointSessionControl);
((Client) sessionControl).getEndpoint().getEndpointInfo().setAddress(endpointSessionControl);
}
哈,成功了! :)
我所要做的就是遵循CXF-documentation for Spring。底部是 "Create a Client (More Manual Way)" 部分。换句话说,我的 /config/webservices.xml
现在是 Java @Bean
s:
@Value("${endpoint.sessionControl}")
private String endpointSessionControl;
@Bean
public SessionControl sessionControl() {
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setServiceClass(SessionControl.class);
jaxWsProxyFactoryBean.setAddress(endpointSessionControl);
jaxWsProxyFactoryBean.setFeatures(Arrays.asList(new LoggingFeature()));
return (SessionControl) jaxWsProxyFactoryBean.create();
}
希望这样实例化JaxWsProxyFactoryBean
没问题