如何在CXF中处理相同的服务和端口名称?

时间:2012-11-27 19:22:24

标签: java cxf

我正在开发一个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不会像通过“熟知”配置那样自动获取...这样消息没有签名:(

2 个答案:

答案 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>