`
lixf5409
  • 浏览: 4559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webservice调用异常

阅读更多

今天遇到一个通过cxf框架实现webservice调用的问题,百度等搜索以后没找到解决问题的方法,所以将解决方法分享出来,希望对大家有所帮助。

1.现象描述:

通过webservice方式执行方法WfPackage getPackage(String pkgId)时,在方法返回时抛出异常。

2014-04-08 14:33:00,244: EXCEPTION

java.lang.StackOverflowError

        at java.nio.ByteOrder.nativeOrder(ByteOrder.java:56)

        at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:313)

        at org.mortbay.io.nio.DirectNIOBuffer.poke(DirectNIOBuffer.java:201)

        at org.mortbay.io.nio.DirectNIOBuffer.poke(DirectNIOBuffer.java:141)

        at org.mortbay.io.AbstractBuffer.put(AbstractBuffer.java:448)

        at org.mortbay.jetty.HttpGenerator.addContent(HttpGenerator.java:148)

        at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644)

        at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579)

        at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:46)

        at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:96)

        at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:184)

        at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:311)

        at org.apache.cxf.aegis.xml.stax.ElementWriter.close(ElementWriter.java:165)

        at org.apache.cxf.aegis.type.basic.BeanType.writeElement(BeanType.java:398)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObjectInternal(BeanType.java:380)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObject(BeanType.java:320)

        at org.apache.cxf.aegis.type.basic.BeanType.writeElement(BeanType.java:396)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObjectInternal(BeanType.java:380)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObject(BeanType.java:320)

        at org.apache.cxf.aegis.type.basic.BeanType.writeElement(BeanType.java:396)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObjectInternal(BeanType.java:380)

        at org.apache.cxf.aegis.type.basic.BeanType.writeObject(BeanType.java:320)

//----xxx此处省略n----------------

 

2014-4-8 14:33:01 org.apache.cxf.phase.PhaseInterceptorChain doIntercept

信息: Interceptor has thrown exception, unwinding now

org.apache.cxf.interceptor.Fault: Can't overwrite cause

        at org.apache.cxf.aegis.databinding.XMLStreamDataReader.read(XMLStreamDataReader.java:62)

        at org.apache.cxf.aegis.databinding.XMLStreamDataReader.read(XMLStreamDataReader.java:38)

        at org.apache.cxf.interceptor.DocLiteralInInterceptor.getPara(DocLiteralInInterceptor.java:235)

        at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:120)

 

//----xxx此处省略n----------------

Caused by: java.lang.IllegalStateException: Can't overwrite cause

        at java.lang.Throwable.initCause(Throwable.java:320)

        at com.ctc.wstx.compat.Jdk14Impl.setInitCause(Jdk14Impl.java:70)

        at com.ctc.wstx.exc.WstxException.<init>(WstxException.java:46)

        at com.ctc.wstx.exc.WstxIOException.<init>(WstxIOException.java:16)

        at com.ctc.wstx.sr.StreamScanner.throwFromIOE(StreamScanner.java:683)

        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1086)

        at org.apache.cxf.staxutils.DepthXMLStreamReader.next(DepthXMLStreamReader.java:220)

        at org.apache.cxf.aegis.xml.stax.ElementReader.getValue(ElementReader.java:136)

        at org.apache.cxf.aegis.type.basic.StringType.readObject(StringType.java:36)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.ArrayType.readCollection(ArrayType.java:86)

        at org.apache.cxf.aegis.type.collection.CollectionType.readObject(CollectionType.java:52)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.ArrayType.readCollection(ArrayType.java:86)

        at org.apache.cxf.aegis.type.collection.CollectionType.readObject(CollectionType.java:52)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:161)

        at org.apache.cxf.aegis.type.basic.ArrayType.readCollection(ArrayType.java:86)

        at

 

//----xxx此处省略n----------------

 

2.分析:

从异常看,是因为方法栈调用陷入了死循环,导致栈内存溢出,应该服务器端执行完,WfPackage接口的实例通过aegis序列化成xml时导致了死循环。

下面看一下WfPackage代码片段:



 

 

WfProcessDefinition代码片段:

 

 

 

WfActivityDefinition代码片段:

 

 

 

WfTransition代码片段:

 

 

 

其中类WfPackage依赖了WfProcessDefinition, WfProcessDefinition依赖了WfActivityDefinition,

对象WfActivityDefinition依赖了WfTransitionWfTransition又依赖了WfActivityDefinition,存在循环依赖。

初步怀疑是这个问题导致的。

 

WfTransition中的

 

    /**

     * 目标活动

     */

    public WfActivityDefinition getToActivity();

    /**

     * 源活动

     */

    public WfActivityDefinition getFromActivity();

 

改为:

 

       /**

     * 目标活动

     */

    public String getToActDefId();

    /**

     * 源活动

     */

    public String getFromActDefId();

 

    返回活动定义的Id

 

去掉了WfTransition中对WfActivityDefinition的依赖。

 

去掉后,问题解决,测试通过。

 

3.其他:

看来aegis数据绑定,除了下面几个约束外,还不允许类的循环依赖。

1.入参、出参如果是集合类型,必须使用泛型,集合中的对象类型的属性、方法中如果有集合类型,也必须使用泛型标识出具体的类型,这个一直到递归到底。

2.必须有settergetter方法,有settergetter方法的话,必须有这个属性。

 

 

 

  • 大小: 26.5 KB
  • 大小: 37.9 KB
  • 大小: 29.3 KB
  • 大小: 32.5 KB
分享到:
评论

相关推荐

    WebService调用代码样例

    本示例主要关注的是如何使用Java进行WebService调用,这在企业级应用开发中非常常见,特别是在需要跨平台集成时。以下是关于这个主题的一些详细知识点: 1. **WebService的基本概念**: WebService是一种基于开放...

    webService调用实例 Demo

    【标题】:“webService调用实例 Demo” 在IT行业中,Web Service是一种常见的应用程序接口(API)形式,它允许不同系统间的交互,无论它们是用何种编程语言或运行在何种操作系统上。本“webService调用实例 Demo”...

    超简单的webservice调用

    【标题】"超简单的webservice调用"涉及的是在Java环境下使用Hutool库进行Web Service接口调用的基础知识。Web Service是一种基于网络的、松散耦合的软件组件交互方式,它允许不同系统间的应用共享数据和服务。在这个...

    SAP-WEBSERVICE调用案例

    ### SAP-WEBSERVICE调用案例 #### 一、引言 随着企业信息化建设的深入发展,SAP作为企业管理软件的佼佼者,在业务流程整合与优化方面扮演着至关重要的角色。而Web Service作为一种标准的跨平台服务交互方式,使得...

    webservice接口调用实例

    7. **异常处理**:在调用过程中可能出现网络错误、服务端错误等问题,需要编写适当的异常处理代码来捕获并处理这些问题。 在实际应用中,Web Service接口调用还涉及到安全性、性能优化和版本控制等话题。例如,可以...

    WSDl生成WebService接口及调用

    在本主题中,我们将深入探讨如何使用WSDL生成WebService接口以及编写Test调用方法进行测试。 1. WSDL基础 WSDL文件是一个XML文档,它描述了服务的位置(endpoint)、使用的消息格式(message)和服务提供的操作...

    短信验证码Webservice调用

    短信验证码Webservice调用是现代Web应用中常见的一种安全验证机制...总之,短信验证码Webservice调用是提升用户体验和系统安全的重要手段。通过合理的API设计和安全实践,我们可以构建一个高效、可靠的短信验证码系统。

    webservice调用,传参代码样例

    Web服务(WebService)是一种基于标准协议的,可互操作的软件接口,允许不同系统之间进行数据交换和功能调用。在本案例中,我们将重点讨论如何使用Axis框架来调用Web服务并传递参数。 首先,我们需要理解Web服务的...

    MVC调用webService

    **MVC调用WebService详解** 在C#的MVC(Model-View-Controller)框架中,调用WebService是一项常见的任务,通常用于实现客户端与服务器之间的数据交互。在本例中,我们将探讨如何在MVC应用中使用JavaScript进行异步...

    WebService调用第三方服务的案例

    WebService调用第三方服务是软件开发中的常见操作,特别是在构建分布式系统和实现跨平台通信时。本案例主要关注如何使用WebService来实现中英文自动转换的功能,这通常涉及到XML、SOAP(Simple Object Access ...

    webservice调用实例,通过HttpClient调用

    Web服务调用是软件开发中的常见任务,尤其是当我们需要跨系统、跨平台集成不同应用程序时。本示例将深入探讨如何使用Apache HttpClient库在Java环境中调用Web服务,特别是通过Maven构建项目的方式进行。HttpClient是...

    .net调用webservice接口例子

    本示例将详细讲解如何使用.NET来调用一个WebService接口,并提供相关的代码实例。 首先,让我们理解Web Service的基本概念。Web Service是一种基于XML(可扩展标记语言)的标准化方法,用于在不同应用程序之间共享...

    jax-ws实现webservice调用

    在本教程中,我们将深入探讨如何使用JAX-WS来发布和调用Web服务。 ### 1. JAX-WS概述 JAX-WS提供了一种简化的方式,将Java方法映射到Web服务操作,反之亦然。它包括以下组件: - **Service Endpoint Interface ...

    webservice 调用接口实例+归属地查询

    通常,WebService调用会抛出异常,需要捕获并适当地处理。 至于`com`,这可能是Java包名的一部分,暗示着我们可能是在Java环境中进行开发。在Java中,`com` 是一个常见的顶级包名,用于组织类和接口。具体到这个...

    VB如何调用WebService

    ### 如何在VB6中实现WebService调用 在VB6中调用WebService,主要涉及到以下步骤: 1. **安装SOAP Toolkit**:首先,你需要安装Microsoft SOAP Toolkit,这是一个支持SOAP通信的工具包,可以为VB6提供必要的类库和...

    oracle调用webservice接口地址demo

    Oracle提供了`UTL_DBWS`包来支持数据库内的WebService调用。该包包含了一系列的过程和函数,用于创建服务、创建调用、设置参数等操作。 - **创建服务**:使用`create_service`函数创建一个服务对象。 - **创建调用*...

    httpClient调用webservice接口

    ### 使用HttpClient调用WebService接口详解 #### 一、概述 在现代软件开发中,Web服务(尤其是WebService)作为实现系统间交互的一种重要手段被广泛采用。WebService提供了通过HTTP协议进行远程过程调用的能力,...

    java+soap+webservice 调用模拟

    通过阅读提供的"java-soap-webservice"文档,你可以进一步了解具体的实现步骤,包括如何设置项目、配置JAX-WS、生成客户端代码、编写调用服务的代码,以及如何解析响应。实践中,不断动手操作和调试是掌握这一技术的...

    Oracle WebService 调用 封装

    在Oracle数据库环境中,WebService调用通常涉及到将外部Web服务接口集成到PL/SQL代码中,以便在数据库端执行远程操作。"Oracle WebService调用封装为PackageBody"这个标题表明我们将探讨如何创建一个PL/SQL包体...

    webservice调用终极解决方案_webservice_源码

    "webservice调用终极解决方案.docx"很可能包含了详细的步骤、示例代码和常见问题解答,它可以帮助开发者快速理解和应用这些解决方案。文档中可能涵盖了如何创建WSDL文件、如何生成客户端代理类、如何调试和测试Web ...

Global site tag (gtag.js) - Google Analytics