2017-02-07 143 views
0

所以,我用WSDL创建了一个Apache CXF的客户端存根应用程序。这个过程相对简单。我在SoapUI界面中完成了它。我提供了WSDL位置,告诉CXF生成客户端存根并打好。然后,我将项目导入到Eclipse中,添加了Apache CXF库,配置了一些安全选项,证书和其他东西。
我写了一个主要的几个测试调用我的web服务,并... 它的工作。Apache CXF如何生成类?

现在我的问题是,我不知道它为什么工作。更具体地说,当我在Eclipse中运行时,调试输出清楚地表明有CXF类被调用。

INFO: Loaded configuration file cxf.xml.

org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL

在我main()我调用

MyServices ss = new MyServices(wsdlURL, SERVICE_NAME); 
port = ss.getWSHttpBindingMyService(); 

MyServices类扩展javax.xml.ws.Service而且也没有什么提示,以CXF。

wsdl2java还生成了一个MyService接口和一个MyServiceImpl类,该类位于相同的包中。它看起来是一个很好的候选人。在我的main()我可以写像port.someMethod(someRequest)的东西。如果我按住Ctrl键并点击someMethod并按照实施方式进行操作,它实际上会将我带到MyServiceImpl类,但那里只有虚拟代码!

public Boolean someMethod(SomeRequest request) { 
      LOG.info("Executing operation"); 
      System.out.println(request); 
      try { 
       Boolean _return = null; 
       return _return; 
      } catch (java.lang.Exception ex) { 
       ex.printStackTrace(); 
       throw new RuntimeException(ex); 
      } 
     } 

所以必须有一些配置,告诉运行时使用哪个实现。但我无法弄清楚它在哪里或哪一个。

感谢

回答

0

无论您使用的CXF或WSDL2Java的生成客户端代码。 客户端代码将按照J2EE规范生成。

生成的代码只是服务的声明,服务的实现将在服务器上。

客户端代码利用webservice wsdl位置来查找服务以及它所暴露的操作。

检入您的MyServices,您会看到您的服务网址。 防爆

wsdlLocation = `"http://127.0.0.1/bookstore/services/search?wsdl"` 

感谢

+0

嗨,什么我问的是,它是如何挂钩生成的Java代码与客户端的CXF实现。 – TXV

+0

您是否在代码中创建任何客户端实例?即org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy .getClient(port); –

+0

是的,我是'客户端客户端= ClientProxy.getClient(服务);' – TXV