【问题标题】:How to call a web-service using JavaEE?如何使用 JavaEE 调用 Web 服务?
【发布时间】:2012-03-12 07:54:55
【问题描述】:

我一直在使用 rpclib 自动生成 WSDL 并在 Python 中实现它。

然后我想使用 JavaEE 调用具有此 WSDL 的 Web 服务*,因此我只是在 Eclipse 的创建向导中使用了 Web Service from WSDL 选项(Indigo 3.7.1 with OEPE ),但随后 Ant 构建失败并出现异常(简而言之):

weblogic.wsee.tools.WsBuildException Error running JAX-WS wsdlc
Caused by java.lang.NoSuchMethodException: javax.xml.bind.annotation.XmlElementRef.required()

我该怎么办?如何使用 JavaEE 调用 Web 服务?

* Web 服务配置为:Apache HTTP Server 2.2.2 + mod_wsgi 3.3 + Python 2.6.5 + rpclib 2.6.1。

【问题讨论】:

    标签: python eclipse web-services jakarta-ee wsdl


    【解决方案1】:

    好的,第二次偶然发现你的帖子,所以我会详细说明我之前给出的评论:)。

    首先我概括一下你的设置:

    • 您有一个工作的 Web 服务和一个指向相应 WSDL 的 URL
    • 您将尝试从不同机器上的不同 Java EE 项目调用 WS 方法

    调用 WS 的常规选项:

    1. 使用Dependency Injection 注入WS 引用
    2. 创建您自己的 WS 存根

    第一个选项在您的设置中不起作用,因为 DI 仅在容器管理的环境中起作用(请参阅我的评论)。这意味着 WS 类和执行类必须在同一个容器中(例如同一个服务器)。

    剩下的就是手动生成 WS 存根。因此,您可以使用您自己的答案中提到的wsimport 工具。有几种不同的方法可以使用这个工具。让我们看看 CLI 的使用:

    1. 在 IDE 使用的 WS 客户端的 projekt 文件夹中导航:%IDE_WORKSPACE%/your project/src
    2. 创建一个新文件夹,例如stub
    3. 在此目录中打开命令窗口
    4. 执行以下命令:wsimport -keep <http://yourwsdl?wsdl>
    5. 刷新后,您应该会看到几个已创建的文件

    回到您的 IDE:

    现在您可以通过从生成的service 文件中获取port 来使用生成的存根文件连接到 WS

    public class WsClient {
    
      public static void main(String[] args) {
        //Create Service
        'GeneratedFile'Service service = new 'GeneratedFile'Service();
    
        //create proxy
        'GeneratedFile' proxy = service.get'GeneratedFile'Port();
    
        //invoke
        System.out.println(proxy.yourMethod(yourParam));
      }
    }
    

    最后的提示:

    • 出于便携目的检查生成的文件。在他们的注释中,有时 WSDL 文件链接到本地​​副本。只需将其改回您的 WSDL-URL。
      AFAIK 在wsimport 工具中有一个option 可以直接在导入例程中进行设置。
    • 有一个名为soapUI 的Eclipse 插件,它允许您在Eclipse 之外的GUI 中使用wsimport 工具。设置完成后,它应该会加速您的工作。
    • 我还发现了quick start guide 在使用 eclipse 开发 WS 客户端。

    希望这有帮助,玩得开心!

    编辑:澄清一下:

    使用wsimport 工具后,您应该有一个包含如图所示文件的目录。为了让这个例子更清楚,你需要从RequestFileService(这是我的 WS 操作)获取一个 Service,比如 RequestFileService service = new RequestFileService();,之后你需要一个 Port em> 像 RequestFile proxy = service.getRequestFilePort(); 这样的服务。
    在此之后,您可以使用端口proxy.yourMethod(yourParam); 调用您的方法调用

    【讨论】:

    • 谢谢。三件事: 1. 我的 web 服务不是 JavaEE 项目(它甚至不是用 Java 编写的)。 2. 我的客户端确实在容器管理的环境中运行(我正在使用 JavaEE -> 我的代码是在应用程序服务器中运行的 EAR 的一部分)。我确实使用 DI (@WebServiceRef),但即便如此,我仍然必须首先使用 wsimport 生成存根。 3.这个soapUI插件看起来不错,我试试看。
    • 回答您的问题: 1. 没关系,您可以使用 WSDL 为任何客户端生成存根。 2.您要调用的 WS 未发布在 same 容器(和 Java)中,因此您无法通过 DI 注入它。您也可以省略注释! 3. 是的,我也喜欢。但这似乎是一个 bit 错误。干杯!
    • 1.是的。 2. 但是,我仍然需要 DI,否则我该如何实例化存根?简单地用“新”? 3. 像几乎所有的 Eclipse 插件一样 :)
    • JavaEE 规范对此有何评论?安全吗?这不就像打开一个套接字而不由应用程序服务器管理吗?
    • 我不是在谈论那种类型的安全。我说的是正确管理服务器资源方面的安全性。哦,我确实设法调用了 WS(有 DI 和没有 DI)。
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多