如何使用JavaEE调用Web服务?

时间:2012-03-12 07:54:56

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

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

然后我想使用JavaEE调用具有此WSDL的Web服务*,因此我只使用Eclipse中的创建向导中的来自WSDL的Web服务选项(带有OEPE的Indigo 3.7.1) ),但随后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。

1 个答案:

答案 0 :(得分:3)

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

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

  • 您有一个有效的Web服务和一个指向相应WSDL的URL
  • 您将尝试从另一台计算机上的其他Java EE项目调用WS方法

调用WS的常规选项:

  1. 使用Dependency Injection注入WS引用
  2. 创建自己的WS存根
  3. 第一个选项在您的设置中不起作用,因为DI只能在容器管理环境中工作(请参阅我的评论)。这意味着WS类和执行类必须位于同一个容器中(例如,同一个服务器)。

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

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

      现在,您可以通过从生成的port - 文件中获取service来使用生成的存根文件连接到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可以直接在导入例程中设置它。
      • Eclipse有一个名为soapUI的插件,它允许您在Eclipse中使用GUI中的wsimport工具。一旦设置,它应该加速你的工作。
      • 我在使用eclipse开发WS客户端时也找到了quick start guide

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

      编辑:只是为了澄清:

      needed files after wsimport generation

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

      调用方法调用