使用CXF使用具有未发布元数据的WSDL

时间:2012-03-14 15:37:44

标签: java wcf soap wsdl cxf

我正在使用CXF与WCF中的WSDL进行通信。事物的WCF方面是在tutorial之后创建的。 Java代码是使用Maven脚本生成的。

我已经使用HTTPS进行加密了。我已经认证工作了。但是,我希望在WCF端关闭WSDL元数据,并且仍然可以使用Java端与服务进行通信。

目前,我可以使用以下代码从Java端访问带有元数据发布的服务:

URL wsdlLocation = new URL("https://server.com:7010/Hservice?wsdl");
HttpsURLConnection connection = (HttpsURLConnection) wsdlLocation.openConnection();
HService service = new HService(wsdlLocation);
HAdminService calc = service.getHAdminService();
... (authentication using WSS4JOutInterceptor code and unrelated code here)
System.out.println(calc.add(new Double(5), new Double(5)));

但是,当我在WCF端关闭元数据发布时,我收到此错误:

Exception in thread "main" javax.xml.ws.WebServiceException:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:90)
    at javax.xml.ws.Service.<init>(Service.java:56)
    at com.blah.hservice.v_1_0.HService.<init>(HService.java:49)
    at Main.main(Main.java:85)`

wsdl所在的页面显示关闭元数据发布(这是摘录):

This is a Windows© Communication Foundation service.

 Metadata publishing for this service is currently disabled.

If you have access to the service, you can enable metadata publishing by completing the following steps to modify your web or application configuration file:

我希望能够搜索“未发布的CXF元数据”并看到很多人这样做......但是没有找到任何东西。如果没有发布WSDL,我如何与此服务进行通信?

2 个答案:

答案 0 :(得分:2)

你真的有两个选择:

  1. 在本地复制wsdl并将客户端指向本地wsdl。这可能是“最佳”选项,因为它确保使用wsdl中的所有信息(如策略等)。
  2. 对wsdl位置使用“null”(注意:不是JAX-WS可移植的)。您需要在创建服务之后和调用getHAdminService之前调用service.addPort(....)以添加具有适当绑定和端点地址的端口。大多数情况下,CXF可以在没有WSDL的情况下工作(将在内部生成注释所需的内容)。但是,如果在WSDL中定义了类似策略的内容,那么它就不能。

答案 1 :(得分:0)

我使用CXF 2.6.5生成的客户端代码

确保QName(第一个参数)与getHAdminService()方法引用的QName匹配。 bindingId(第二个参数)应该是SOAPBinding Interface(javax.xml.ws.soap.SOAPBinding)中定义的常量之一。