我正在开发一个 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 通过自动装配配置的, 但是使用 Spring 定义的 Port bean 因为它具有相同的名称,并且这些定义是通过相同的名称查找的。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 不会像通过...的“众所周知”配置那样自动拾取,因此消息未签名:(