今天遇到一个通过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依赖了WfTransition,WfTransition又依赖了WfActivityDefinition,存在循环依赖。
初步怀疑是这个问题导致的。
将WfTransition中的
/**
* 目标活动
*/
public WfActivityDefinition getToActivity();
/**
* 源活动
*/
public WfActivityDefinition getFromActivity();
改为:
/**
* 目标活动
*/
public String getToActDefId();
/**
* 源活动
*/
public String getFromActDefId();
返回活动定义的Id
去掉了WfTransition中对WfActivityDefinition的依赖。
去掉后,问题解决,测试通过。
3.其他:
看来aegis数据绑定,除了下面几个约束外,还不允许类的循环依赖。
1.入参、出参如果是集合类型,必须使用泛型,集合中的对象类型的属性、方法中如果有集合类型,也必须使用泛型标识出具体的类型,这个一直到递归到底。
2.必须有setter和getter方法,有setter和getter方法的话,必须有这个属性。
相关推荐
本示例主要关注的是如何使用Java进行WebService调用,这在企业级应用开发中非常常见,特别是在需要跨平台集成时。以下是关于这个主题的一些详细知识点: 1. **WebService的基本概念**: WebService是一种基于开放...
【标题】:“webService调用实例 Demo” 在IT行业中,Web Service是一种常见的应用程序接口(API)形式,它允许不同系统间的交互,无论它们是用何种编程语言或运行在何种操作系统上。本“webService调用实例 Demo”...
【标题】"超简单的webservice调用"涉及的是在Java环境下使用Hutool库进行Web Service接口调用的基础知识。Web Service是一种基于网络的、松散耦合的软件组件交互方式,它允许不同系统间的应用共享数据和服务。在这个...
### SAP-WEBSERVICE调用案例 #### 一、引言 随着企业信息化建设的深入发展,SAP作为企业管理软件的佼佼者,在业务流程整合与优化方面扮演着至关重要的角色。而Web Service作为一种标准的跨平台服务交互方式,使得...
7. **异常处理**:在调用过程中可能出现网络错误、服务端错误等问题,需要编写适当的异常处理代码来捕获并处理这些问题。 在实际应用中,Web Service接口调用还涉及到安全性、性能优化和版本控制等话题。例如,可以...
在本主题中,我们将深入探讨如何使用WSDL生成WebService接口以及编写Test调用方法进行测试。 1. WSDL基础 WSDL文件是一个XML文档,它描述了服务的位置(endpoint)、使用的消息格式(message)和服务提供的操作...
短信验证码Webservice调用是现代Web应用中常见的一种安全验证机制...总之,短信验证码Webservice调用是提升用户体验和系统安全的重要手段。通过合理的API设计和安全实践,我们可以构建一个高效、可靠的短信验证码系统。
Web服务(WebService)是一种基于标准协议的,可互操作的软件接口,允许不同系统之间进行数据交换和功能调用。在本案例中,我们将重点讨论如何使用Axis框架来调用Web服务并传递参数。 首先,我们需要理解Web服务的...
**MVC调用WebService详解** 在C#的MVC(Model-View-Controller)框架中,调用WebService是一项常见的任务,通常用于实现客户端与服务器之间的数据交互。在本例中,我们将探讨如何在MVC应用中使用JavaScript进行异步...
WebService调用第三方服务是软件开发中的常见操作,特别是在构建分布式系统和实现跨平台通信时。本案例主要关注如何使用WebService来实现中英文自动转换的功能,这通常涉及到XML、SOAP(Simple Object Access ...
Web服务调用是软件开发中的常见任务,尤其是当我们需要跨系统、跨平台集成不同应用程序时。本示例将深入探讨如何使用Apache HttpClient库在Java环境中调用Web服务,特别是通过Maven构建项目的方式进行。HttpClient是...
本示例将详细讲解如何使用.NET来调用一个WebService接口,并提供相关的代码实例。 首先,让我们理解Web Service的基本概念。Web Service是一种基于XML(可扩展标记语言)的标准化方法,用于在不同应用程序之间共享...
在本教程中,我们将深入探讨如何使用JAX-WS来发布和调用Web服务。 ### 1. JAX-WS概述 JAX-WS提供了一种简化的方式,将Java方法映射到Web服务操作,反之亦然。它包括以下组件: - **Service Endpoint Interface ...
通常,WebService调用会抛出异常,需要捕获并适当地处理。 至于`com`,这可能是Java包名的一部分,暗示着我们可能是在Java环境中进行开发。在Java中,`com` 是一个常见的顶级包名,用于组织类和接口。具体到这个...
### 如何在VB6中实现WebService调用 在VB6中调用WebService,主要涉及到以下步骤: 1. **安装SOAP Toolkit**:首先,你需要安装Microsoft SOAP Toolkit,这是一个支持SOAP通信的工具包,可以为VB6提供必要的类库和...
Oracle提供了`UTL_DBWS`包来支持数据库内的WebService调用。该包包含了一系列的过程和函数,用于创建服务、创建调用、设置参数等操作。 - **创建服务**:使用`create_service`函数创建一个服务对象。 - **创建调用*...
### 使用HttpClient调用WebService接口详解 #### 一、概述 在现代软件开发中,Web服务(尤其是WebService)作为实现系统间交互的一种重要手段被广泛采用。WebService提供了通过HTTP协议进行远程过程调用的能力,...
通过阅读提供的"java-soap-webservice"文档,你可以进一步了解具体的实现步骤,包括如何设置项目、配置JAX-WS、生成客户端代码、编写调用服务的代码,以及如何解析响应。实践中,不断动手操作和调试是掌握这一技术的...
在Oracle数据库环境中,WebService调用通常涉及到将外部Web服务接口集成到PL/SQL代码中,以便在数据库端执行远程操作。"Oracle WebService调用封装为PackageBody"这个标题表明我们将探讨如何创建一个PL/SQL包体...
"webservice调用终极解决方案.docx"很可能包含了详细的步骤、示例代码和常见问题解答,它可以帮助开发者快速理解和应用这些解决方案。文档中可能涵盖了如何创建WSDL文件、如何生成客户端代理类、如何调试和测试Web ...