【问题标题】:How does class generation with Apache CXF work?使用 Apache CXF 生成类是如何工作的?
【发布时间】:2017-06-24 15:25:25
【问题描述】:

所以,我使用 Apache CXF 从 WSDL 创建了一个客户端存根应用程序。这个过程相对简单。我是在 SoapUI 界面中完成的。我提供了 WSDL 位置,告诉 CXF 生成客户端存根并点击 OK。

然后,我将项目导入 Eclipse,添加 Apache CXF 库,配置一些安全选项、证书等。
我编写了一个对我的 web 服务进行一些测试调用的 main,并且...它成功了。

现在我的问题是我不知道它为什么起作用。更具体地说,当我在 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-click 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);
            }
        }

所以必须有一些配置告诉运行时使用哪个实现。但我不知道它在哪里或哪一个。

谢谢

【问题讨论】:

    标签: java cxf


    【解决方案1】:

    无论您使用 cxf 还是 wsdl2java 来生成客户端代码。 客户端代码将按照 J2EE 规范生成。

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

    客户端代码使用 webservice wsdl 位置来查找服务及其公开的操作。

    检查您的 MyServices ,您将看到您的服务 URL。 例

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

    谢谢

    【讨论】:

    • 您是否在代码中创建任何客户端实例。即 org.apache.cxf.endpoint.Client 客户端 = org.apache.cxf.frontend.ClientProxy .getClient(port);
    • 您正在创建的这个客户端实例来自 cxf 相关的 jar。您已经在项目中添加了 cxf 客户端 jar 依赖项。因此,一旦您尝试运行主程序,它就会尝试读取您的本地 cxf.xml 配置文件以检查配置。然后它执行调用。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多