【发布时间】:2012-11-27 19:22:24
【问题描述】:
我正在开发一个 CXF (2.2.7) Web 客户端来连接到在 WSDL 中具有相同服务和端口名称的 Web 服务。 客户端使用私钥通过 SSL 连接,并使用相同的私钥对消息进行签名。 SSL 连接通过“http:conduit”配置工作。我可以连接。
我的 spring 配置有问题,因为 Service 和 Port 名称相同,我不知道如何解决它。 配置客户端的常规/众所周知的方法是:
<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 通过自动装配配置的,但使用 Port 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 客户端配置 :(...而且我真的不知道如何处理。如何做到这一点?
目前我不确定最好的方法是什么?可能对服务/端口进行一些重命名(我不是肥皂专家)。或者使用 Spring 使用的其他 id 来查找 bean 定义,以便它们对于端口和服务是唯一的,即使名称相同?...
请帮忙?
额外说明:我通过在名称属性中使用通配符使“http:conduit”与老式配置一起工作。但是 ws-securityPolicy 不会像通过...的“众所周知”配置那样自动获取,因此消息没有签名:(
【问题讨论】: