我正在开发一个CXF(2.2.7)Web客户端,以连接到WSDL中具有相同服务和端口名称的Web服务。 客户端通过SSL与私钥连接,并使用相同的私钥对消息进行签名。 SSL连接通过“http:conduit”配置工作。我能够连接。
我遇到弹簧配置问题,因为服务和端口名称相同,我不太清楚如何解决它。 配置客户端的常规/众所周知的方法是:
<jaxws:client name="{http://bla.com/1.2/}PortA" createdFromAPI="true">...</jaxws:client>
然而,在运行时,我收到以下错误:
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'bus' of bean class [org.apache.cxf.service.ServiceImpl]: Bean property 'bus' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
如果您使用“服务”名称而不是jaxws名称属性(ServiceA而非PortA)中的端口名称,则此错误是众所周知的错误。 但是,在我的情况下,服务名称和端口名称是相同的:( ...而且它不是我的wdsl所以我不能改变它... 发生的事情是创建的jaxws:client bean是通过Spring自动装配配置的,但使用Spring bean的Spring定义,因为它具有相同的名称,这些定义通过相同的名称查找。 Port bean是一个类型为“org.apache.cxf.jaxws.JaxWsProxyFactoryBean”的实例,在该实例上可以将总线设置为属性,但不能在ServiceImpl上设置。
无论如何:如何最好地处理这个问题? 我尝试使用CXF网站上描述的“旧时尚”配置方式:
<jaxws:client id="someId" serviceClass="TheServiceClass" address="https://bla.com/webservice">
但是,这会导致SSL错误,显然HTTP管道配置不会自动链接到我的jaxws客户端配置:( ...我真的不知道如何处理它。如何做到这一点?< / p>
目前我不确定最好的方法是什么?可能有些重命名服务/端口(我不是肥皂专家)。或者使用Spring使用的一些其他id来查找bean定义,使得它们对于端口和服务是唯一的,即使名称相同?...或者以旧时尚的方式进行,但是如何?
请帮忙解决一下这个问题?
额外注意:我使用name属性中的通配符使用旧时配置的“http:conduit”。但是,ws-securityPolicy不会像通过“熟知”配置那样自动获取...这样消息没有签名:(
答案 0 :(得分:1)
实际上,您可以更改服务名称,使其与端口名称不同。这将改变WSDL本身,但不会与客户签订合同。我遇到了同样的问题,没有办法解决这个问题。
答案 1 :(得分:1)
您可以按以下方式使用它。
<jaxrs-client:client id="clientId" serviceName="clientServiceName"
address="${urlService}" >
</<jaxrs-client:client>
<http-conf:conduit name="*clientServiceName*.http-conduit" >
<http-conf:client ReceiveTimeout="1"/>
</http-conf:conduit>