我正在试验Apache CXF,并对客户端部分有疑问.
下面是我目前的一些com.example.customerservice.service.CustomerService的WS客户端的Spring配置:
如您所见,地址属性是静态配置的.这不适合我,因为我事先不知道服务器URL.此外,在某些情况下,我想将此客户端用于具有不同地址的不同服务.
因此,Spring中服务器地址的静态配置是不合适的.所以我的问题是 – 我怎样才能让它变得动态?
>目前我的解决方案是设置一个系统属性 – 类似于baseUrl,并使用属性占位符配置器将其注入Spring配置.
>另一种可能性是简单地手动构建客户端,我也不喜欢.
但我相信我真的错过了一些东西.也许有可能像clientFactory.createClientFor(“http:// myserver:8080”)这样的东西?
你有几个选择:
1)如果要保留Spring上下文并更改地址
在运行时以编程方式:
您可以在请求上下文中设置标准属性.这是一个例子
如何以编程方式执行此操作.
BindingProvider bp =(BindingProvider)端口;
Map context = bp.getRequestContext();
Object oldAddress = context.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY);
context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
新地址);
执行此操作时,您应该了解对客户端的多线程访问
代理.请参阅CXF FAQ(JAX-WS客户端代理线程是否安全?)
2)如果您愿意/能够提供WSDL URL并使用JAX-WS API,那么
可编写可创建连接到端点的客户端代理的可移植代码
你选择的.您可以使用“createdFromAPI”(配置Spring)
Spring上下文文件中的客户端(选项1))属性仍然允许
基于Spring的以编程方式构造的客户端代理的配置.
我认为这里也支持通配符,所以你应该能够
使用您的单个条目配置多个客户端
春天的背景.如果端点,这种方法将变得更加复杂
命名空间/本地名称在您尝试的端点之间差异很大
与…相互作用.
3)以编程方式使用org.apache.cxf.jaxws.JaxWsProxyfactorybean,如图所示
在配置Spring客户端的Spring配置中(选项2)[2].
这使您可以设置接口和地址并创建新的客户端代理
实例随意.您甚至可能想要配置一个这样的实例
具有大多数属性的工厂已经在Spring中设置然后将其注入
您的代码,您可以在其中更改地址并构建新的客户端代理
随意(当然提供对工厂bean的同步访问).
您还可以缓存客户端代理,以避免重新创建的费用
他们反复.
http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%253F
http://cxf.apache.org/docs/jax-ws-configuration.html