【问题标题】:Axis2's wsdl2java fails on RPC/Encoded style web servicesAxis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败
【发布时间】:2010-11-24 08:32:51
【问题描述】:

Axis2 有什么替代品吗?或者让它工作的方式(例如不同的数据绑定)?

Retrieving document at '...'.
Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:271)
        at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)
        at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at org.apache.axis2.wsdl.codegen.extension.SimpleDBExtension.engage(SimpleDBExtension.java:53)
        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:224)
        ... 2 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.axis2.wsdl.codegen.extension.SimpleDBExtension.engage(SimpleDBExtension.java:50)
        ... 3 more
Caused by: org.apache.axis2.schema.SchemaCompilationException: can not find type {http://schemas.xmlsoap.org/soap/encoding/}Array from the parent schema ...        at org.apache.axis2.schema.SchemaCompiler.copyMetaInfoHierarchy(SchemaCompiler.java:1296)
        at org.apache.axis2.schema.SchemaCompiler.processComplexContent(SchemaCompiler.java:1258)
        at org.apache.axis2.schema.SchemaCompiler.processContentModel(SchemaCompiler.java:1153)
        at org.apache.axis2.schema.SchemaCompiler.processComplexType(SchemaCompiler.java:1097)
        at org.apache.axis2.schema.SchemaCompiler.processNamedComplexSchemaType(SchemaCompiler.java:1017)
        at org.apache.axis2.schema.SchemaCompiler.processSchema(SchemaCompiler.java:931)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:766)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:552)
        at org.apache.axis2.schema.SchemaCompiler.process(SchemaCompiler.java:1991)
        at org.apache.axis2.schema.SchemaCompiler.processParticle(SchemaCompiler.java:1874)
        at org.apache.axis2.schema.SchemaCompiler.processComplexType(SchemaCompiler.java:1081)
        at org.apache.axis2.schema.SchemaCompiler.processNamedComplexSchemaType(SchemaCompiler.java:1017)
        at org.apache.axis2.schema.SchemaCompiler.processSchema(SchemaCompiler.java:931)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:766)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:552)
        at org.apache.axis2.schema.SchemaCompiler.process(SchemaCompiler.java:1991)
        at org.apache.axis2.schema.SchemaCompiler.processParticle(SchemaCompiler.java:1874)
        at org.apache.axis2.schema.SchemaCompiler.processComplexType(SchemaCompiler.java:1081)
        at org.apache.axis2.schema.SchemaCompiler.processAnonymousComplexSchemaType(SchemaCompiler.java:980)
        at org.apache.axis2.schema.SchemaCompiler.processSchema(SchemaCompiler.java:934)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:592)
        at org.apache.axis2.schema.SchemaCompiler.processElement(SchemaCompiler.java:563)
        at org.apache.axis2.schema.SchemaCompiler.compile(SchemaCompiler.java:370)
        at org.apache.axis2.schema.SchemaCompiler.compile(SchemaCompiler.java:280)
        at org.apache.axis2.schema.ExtensionUtility.invoke(ExtensionUtility.java:103)
        ... 8 more

注意:Apache CXF 也失败了 :(

【问题讨论】:

    标签: java axis2 axis wsdl2java jax-rpc


    【解决方案1】:

    我发现只有 3 个选项可以在 Java 中用于老式 rpc/编码的 Web 服务:

    1) SUN 的 JAX-RPC 参考实现(wscompile

    2)WebLogic的clientgen(我用的是8.1版本)

    3) Axis1 v1.4 wsdl2java

    最初我们为此使用了 Axis 1.4,它在相对较大的服务响应 (>20k) 上表现出相当差的性能,即与没有解析的普通 HTTP 请求相比,客户端处理时间增加了两倍以上。如果响应变大,时间就会增长。仅反序列化 1MB 大响应就花费了 30 多秒。

    SUN 生成的客户端并没有真正工作,它根据请求失败并显示以下消息:

    unexpected element name: 
       expected=getSubscriberInfoReturn, 
       actual={ws.generated.api}getSubscriberInfoReturn
    

    我尝试使用 WebLogic 的 8.1 clientgen,并将客户端代码与 Axis 1.4 生成的客户端的性能进行了比较。 Axis 赢得了比赛。因此,即使 Axis 客户端在相对较大的响应上表现不佳,它仍然是旧 rpc/编码 Web 服务的最佳选择:(。

    【讨论】:

    • 你能告诉我如何精确地做到这一点吗?运行java -classpath path/to/axis-1_4/lib/ org.apache.axis.wsdl.WSDL2Java 时,我得到了Error: Could not find or load main class org.apache.axis.wsdl.WSDL2Java
    • 伙计,那是 6 年前 :)。您的错误表明您的类路径有问题。
    【解决方案2】:

    Axis2 不支持 RPC 编码。来源:http://wiki.apache.org/ws/StackComparison

    【讨论】:

      【解决方案3】:

      试试 Axis 1,我就是因为这个原因才使用它的。

      【讨论】:

      • 是的,我们目前使用轴 1,实际上。但是我们遇到了性能问题:(。您知道 Axis 1 或 2 或 Apache CXF 的任何其他替代方案吗?
      【解决方案4】:

      我在axis2 中也遇到过SimpleDataBinding 的问题。我通过使用解决了它们 AxisDataBinding 选项。从编码的角度来看,这有点重, 但毕竟有效。

      ADB in detail

      此外,我同意 Robert 的观点,他说 axis1 也是一个有趣的选择。

      【讨论】:

        【解决方案5】:

        您可以为wsdl2java 命令添加以下参数

        -d xmlbeans
        

        【讨论】:

          【解决方案6】:

          我不打算对此进行深入探讨,但既然您要求替代方案:

          Java 6 SE 和 Java 5 EE 附带 Metro JAX-WS(参考)实现。

          它位于javax.xml.ws 命名空间中。

          Sun 的开发者网络有一篇文章 Introducing JAX-WS 2.0 With the Java SE 6 Platform 可能有用。

          说了这么多,Eclipse 不是很JAX-WS friendly

          【讨论】:

          • 我很乐意使用 JAX-WS,但 JAX-WS 不支持 rpc/encoded 样式的 Web 服务。而且我无法更改网络服务 :(,但我需要一个客户端。
          • 我尝试过使用 JAX-RPC 参考实现和 wscompile。在下载了 SUN 正常分发中没有包含的所有 jar 之后,我设法生成了客户端,但它失败了异常: *Caused by: unexpected element name: expected=getSubscriberInfoReturn, actual={ws.generated.api}getSubscriberInfoReturn
          【解决方案7】:

          如果肥皂编码样式过时,则会出现此问题 axis2 wsdl2java 或 wsimport 无法理解旧的 RPC 编码风格 所以使用轴 1.4 或更旧版本的轴 缺点是你不会在旧轴中找到 wsdl2java 作为工具 相反,您会在轴 jar 文件中找到它作为类文件 所以你必须手动设置类路径并使用该类

          D:\axis-1_4\lib>java -classpath \axis-1_4\lib* org.apache.axis.wsdl.WSDL2Java urwsdl

          【讨论】:

            【解决方案8】:

            在这里找到关于 soapenc.xsd 的答案帖子 Clickatell SOAP wsdl to JAXB java classes 帮了我。

            我使用的是axis1.5的wsdl2java实用程序,我们在数组上遇到了类似的错误。

            Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
                        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:271)
                        at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)
                        at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)
                Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
                        at org.apache.axis2.wsdl.codegen.extension.SimpleDBExtension.engage(SimpleDBExtension.java:53)
                        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:224)
                        ... 2 more
                Caused by: java.lang.reflect.InvocationTargetException
                        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
                        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
                        at java.lang.reflect.Method.invoke(Method.java:597)
                        at org.apache.axis2.wsdl.codegen.extension.SimpleDBExtension.engage(SimpleDBExtension.java:50)
                        ... 3 more
                Caused by: org.apache.axis2.schema.SchemaCompilationException: can not find type {http://schemas.xmlsoap.org/soap/encoding/}Array from the parent schema ....
                        at org.apache.axis2.schema.SchemaCompiler.copyMetaInfoHierarchy(SchemaCompiler.java:1296)
                        at org.apache.axis2.schema.SchemaCompiler.processComplexContent(SchemaCompiler.java:1258)
                        at org.apache.axis2.schema.SchemaCompiler.processContentModel(SchemaCompiler.java:1153)
                        at org.apache.axis2.schema.SchemaCompiler.processComplexType(SchemaCompiler.java:1097)
                        at org.apache.axis2.schema.SchemaCompiler.processNamedComplexSchemaType(SchemaCompiler.java:1017)
            

            我尝试通过使用网站“http://schemas.xmlsoap.org/soap/encoding/”中的内容创建 soapenc.xsd 来更新我的 wsdl 文件。 如下所示,这对我来说真的很有效。

            <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1= .. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns=.. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace=..>
            <types>
                <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace=.. xmlns:ns1=.. xmlns:ns2=.. xmlns:tns=.. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/>
            </types>
            <import location="soapenc.xsd" namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <message name="Input">
                <part name=../>
            </message>
            <message name="Output">
                <part name=../>
            </message>
            <portType name=".."> .. </portType>
            <binding name="..." type="tns:"..">
                <operation name="...">          ..          </operation>
                <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
            </binding>
            <service name="...">
                <port binding="tns:..." name="...">         <soap:address location="..."/>      </port>
            </service>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-05
              • 1970-01-01
              • 1970-01-01
              • 2020-09-07
              • 1970-01-01
              • 1970-01-01
              • 2011-05-30
              相关资源
              最近更新 更多