CXF / @ImportResource与PropertySourcesPlaceholderConfigurer

时间:2015-02-17 14:51:23

标签: xml spring properties cxf cxf-client

我在使用@ImportResource进行PropertySourcesPlaceholderConfigurer工作时遇到问题。我能找到的最接近的是this question,但我无法理解如何让它对我起作用。

这是我的配置类:

@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 - 文件中定义。

据我了解,在PropertySourcesPlaceholderConfigurer存在之前解析和评估XML,因此,没有任何代码替换占位符。但是,我如何使Spring的内部理解它应该在读取所有属性后解析XML?使用@ImportResource是否正确?我需要为Spring提供什么?或者是否有一个相当简单的技巧让它发挥作用?

我是春天这一部分的菜鸟生命周期和豆类工厂的菜鸟,我总是很惊讶它是如何运作良好的(通常)。

- EDIT--
我一直试图在@PostConstruct中设置地址,但我无法使其正常工作。它总是回到&#34; $ {...}&#34;:

  @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);
  }

1 个答案:

答案 0 :(得分:0)

哈,做到了! :)

我必须遵循CXF-documentation for Spring。在底部是“创建客户端(更多手动方式)&#34;”部分。换句话说,我的/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是可以的。