[英]How to send requests and receive responses to/from an Apache CXF-based service?
[英]How to provide server address to the Spring-configured Apache CXF-based web service client?
我正在试验Apache CXF,并对客户端部分有疑问。
下面是我目前的一些com.example.customerservice.service.CustomerService
的WS客户端的Spring配置:
<jaxws:client
name="com.example.customerservice.service.CustomerServiceClient"
serviceName="customer:CustomerServiceService" endpointName="customer:CustomerServiceEndpoint"
address="http://localhost:8080/CustomerServicePort"
serviceClass="com.example.customerservice.service.CustomerService">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:client>
如您所见, address
属性是静态配置的。 这不适合我,因为我事先不知道服务器URL。 此外,在某些情况下,我想将此客户端用于具有不同地址的不同服务。
因此,Spring中服务器地址的静态配置是不合适的。 所以我的问题是 - 我怎样才能让它变得动态?
baseUrl
并使用属性占位符配置器将其注入Spring配置。 但我相信我真的错过了一些东西。 也许有可能像clientFactory.createClientFor("http://myserver:8080")
?
请参阅CXF用户邮件列表的帖子。
你有几个选择:
1)如果要保留Spring上下文,并在运行时以编程方式更改地址:
您可以在请求上下文中设置标准属性。 以下是以编程方式执行此操作的示例。
BindingProvider bp =(BindingProvider)端口; Map context = bp.getRequestContext(); Object oldAddress = context.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,newAddress);
执行此操作时,您应该了解对客户端代理的多线程访问。 请参阅CXF FAQ(JAX-WS客户端代理线程是否安全?)
2)如果您愿意/能够提供WSDL URL并使用JAX-WS API,您可以编写可移植代码,该代码将创建连接到您选择的端点的客户端代理。 您可以使用Spring上下文文件中的“createdFromAPI”(配置Spring Client(选项1))属性来仍然允许以编程方式构造的客户端代理的基于Spring的配置。 我认为这里也支持通配符,因此您应该能够在Spring上下文中使用单个条目配置许多客户端。 如果端点名称空间/本地名称在您尝试与之交互的端点之间差别很大,则此方法将变得更加复杂。
3)以编程方式使用org.apache.cxf.jaxws.JaxWsProxyFactoryBean,如配置Spring Client的Spring配置(选项2)[2]所示。 这使您可以设置接口和地址,并随意创建新的客户端代理实例。 您甚至可能希望配置此工厂的单个实例,其中大多数属性已在Spring中设置,然后将其注入到您的代码中,您可以在其中更改地址并随意构建新的客户端代理(提供对工厂bean的同步访问)课程)。 您还可以缓存客户端代理,以避免重复创建它们的费用。
http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%253F http://cxf.apache.org/docs/jax-ws-configuration.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.