【问题标题】:Axis2 Web Service Client Generation - Types without modifying the clientAxis2 Web 服务客户端生成 - 无需修改客户端的类型
【发布时间】:2010-09-17 08:12:12
【问题描述】:

是否可以使用 Axis2 和 Eclipse 生成 Web 服务客户端并让它使用包中已有的 java 类型,而不是创建它自己的类型。原因当然是如果我已经创建了 A 类型并且它创建了它自己的 A 类型,我不能只将 A 类型的变量分配给 B 类型的变量。

wsdl 是从部署到应用程序服务器的 Web 服务生成的。 如果无法从中生成它,则可以从已经存在的 java 文件中生成客户端。

【问题讨论】:

    标签: java code-generation axis2 wsdl2java


    【解决方案1】:

    如果您真的想重用现有的类,您可以直接调用 Axis2 API,而无需使用 wsdl2java 生成客户端。下面是调用 Web 服务的一些相对简单的代码。您只需填写 Web 服务端点、方法 QName、预期返回类和服务参数。您可以重用现有的类作为返回值或参数。

    如果您的 Web 服务相当复杂,那么您可能会发现您必须更深入地了解 API 才能使这种方法发挥作用。

    serviceClient = new RPCServiceClient();
    Options options = serviceClient.getOptions();
    
    EndpointReference targetEPR = new EndpointReference("http://myservice");
    
    options.setTo(targetEPR);
    
    QName methodName = new QName("ns","methodName");
    
    Class<?>[] returnTypes = new Class[] { String.class };
    
    Object[] args = new Object[] { "parameter" };
    
    Object[] response = serviceClient.invokeBlocking(methodName, args,
                    returnTypes);
    

    【讨论】:

      【解决方案2】:

      您是从 wsdl 生成 Web 服务客户端,对吗?

      wsdl2java 工具只知道 wsdl 中的信息,因此它不会知道您已经创建的任何类型。

      如果您可以将类型信息输入到 wsdl 中,您可能会使其工作,尽管我从未尝试过。

      如果您想要一种简单的方法从 Type A 复制到 Type B,那么您可以尝试BeanUtils.copyProperties,只要 Type A 和 Type B 的 setter 和 getter 匹配即可。

      【讨论】:

        【解决方案3】:

        几乎大多数 java webservices 项目都会经历这个。我不知道 .NET/C# 世界是否有更优雅的解决方案。

        正如 Mike 所说,使用 BeanUtils.copyProperties 是有意义的。

        BR,
        ~A

        【讨论】:

          【解决方案4】:

          如果您使用 eclipse 作为您的 ide,那么您需要:http://www.eclipse.org/webtools/。它超越了你想要的一切。

          【讨论】:

            【解决方案5】:

            您可以直接使用ServiceClient 类调用Web 服务,它只提供使用XML 的调用并返回XML 响应。对于 Web 服务的不同方法,您必须将 XML 响应转换为一些 java POJO 才能使用它。只有响应处理需要在您的最后完成。您可以从 XML 到 Map 等...

            因此您不需要任何其他存根类来调用任何 Web 服务,只需要处理响应 XML。您可以使用 Castor 或 JAXB 库将 XML 转换为 POJO。

            这是您无需每次都修改客户端以进行差异化的方式。网页服务。您可以像在外部向客户端提供响应处理程序一样进行开发。因此,对于每个不同的 Web 服务,您都会有差异。响应处理程序类,它是您的接口的实现。

            //common interface for response handlers...
            //implement this for diff. web service/methods
            public interface WSRespHandler{
                public Object getMeResp(Object respData);
            }
            
            
            //pass particular handler to client when you call some WS
            public class WebServiceClient {
                public Object getResp(WSRespHandler respHandler) {
                    ..
            
                    return repHandler.getMeResp(xmlData);
                }
            }
            

            参考:

            http://www.developer.com/java/web/article.php/3863416/Using-Axis2-and-Java-for-Asynchronous-Web-Service-Invocation-on-the-Client-Side.htm

            http://www.devdaily.com/blog/post/java/java-web-service-client-read-array-list/

            谢谢。

            www.techlads.com

            【讨论】:

              【解决方案6】:

              如果这篇文章对我阅读axis2生成客户端指南的人仍然有用:http://axis.apache.org/axis2/java/core/docs/userguide-creatingclients.html。

              Axis2 Eclipse 插件似乎配置为在集成模式下调用 ADB 代码生成(请参阅http://axis.apache.org/axis2/java/core/docs/adb/adb-howto.html),从而在 Web 服务存根中创建内部类。我不知道是否可以将生成模式更改为扩展模式(从存根类生成数据类),但您可以使用 Wsdl2Java 命令行:

                  %AXIS2_HOME%\bin\WSDL2Java -uri <wsdl file path> -p <package name> -u
              

              -u 选项告诉 ADB 代码生成器将数据类创建为单独的类,而不是存根中的内部类。

              【讨论】:

                猜你喜欢
                • 2012-05-19
                • 2014-01-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-09-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多