-
cxf 结合 spring 发布web service时 不能实例化User对象的问题5
在service层中调用了Dao方法来进行数据库的操作 然后又重新了UserWebservice接口及其实现类 在实现类中直接调用service的方法
domain中
User类
public abstract class User {
private String userName;
private String userPassword;
private String mobile;
private String email;
private String nickname;
private String region;
private java.util.Date birthday ;
private String telephone;
private String address;
private String postcode;
private String signature;
private String imageUrl;
private int userID;
private Set<Right> rightSet = new HashSet<Right>();
//getter 和setter略
@Override
public String toString() {
return "User [userName=" + userName + ", userPassword=" + userPassword
+ ", mobile=" + mobile + ", email=" + email + ", nickname="
+ nickname + ", region=" + region + ", birthday=" + birthday
+ ", telephone=" + telephone + ", address=" + address
+ ", postcode=" + postcode + ", signature=" + signature
+ ", imageUrl=" + imageUrl + ", userID=" + userID
+ ", rightSet=" + rightSet.size() + "]";
}
}
public class Member extends User { @Override public boolean getIsAdmin() { // TODO Auto-generated method stub return false; } }
public class Admin extends User { @Override public boolean getIsAdmin() { // TODO Auto-generated method stub return true; } }
Right类public class Right { private int rightID; private String name; private Set<User> userSet = new HashSet<User>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRightID() { return rightID; } public void setRightID(int rightID) { this.rightID = rightID; } public Set<User> getUserSet() { return userSet; } public void setUserSet(Set<User> userSet) { this.userSet = userSet; } @Override public String toString() { return "Right [rightID=" + rightID + ", name=" + name + ", userSet=" + userSet.size() + "]"; } }
发布成web service后 写了一个public class ClientTest { public static void main(String[] args) throws Exception { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(UserWebservice.class); factory.setAddress("http://localhost:8080/TwoTablesSSH/services/UserWebService"); UserWebservice webservice = (UserWebservice) factory.create(); ]User user = webservice.queryByID(1); System.out.println(user); } }
结果出错了
Exception in thread "main" org.apache.cxf.binding.soap.SoapFault: Marshalling Error: A cycle is detected in the object graph. This will cause infinitely deep XML: User [userName=admin, userPassword=admin, mobile=admin, email=admin, nickname=admin, region=null, birthday=2011-11-25 17:16:37.0, telephone=null, address=null, postcode=null, signature=null, imageUrl=null, userID=1, rightSet=4] -> Right [rightID=1, name=UpdateRight, userSet=1] -> User [userName=admin, userPassword=admin, mobile=admin, email=admin, nickname=admin, region=null, birthday=2011-11-25 17:16:37.0, telephone=null, address=null, postcode=null, signature=null, imageUrl=null, userID=1, rightSet=4]
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:141)
at $Proxy30.queryByID(Unknown Source)
at com.tianxiao.whut.client.ClientTest.main(ClientTest.java:22)
出现了循环引用对象的问题,看网上的解决办法,将@XmlTransient放在了Right类中的
@XmlTransient
public Set<User> getUserSet() {
return userSet;
}
结果 出现了无法实例化User的问题
org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unable to create an instance of com.tianxiao.whut.domain.User
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:801)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:642)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156)
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:797)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1626)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1493)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1401)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:648)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
at $Proxy31.queryByID(Unknown Source)
at com.tianxiao.whut.client.ClientTest.main(ClientTest.java:22)
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:434)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:371)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:348)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:778)
... 20 more
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:629)
at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:185)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:501)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:247)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:181)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:369)
... 22 more
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]
... 31 more
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.sun.xml.bind.v2.ClassFactory.create0(ClassFactory.java:122)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:282)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:623)
... 28 more
Exception in thread "main" org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unable to create an instance of com.tianxiao.whut.domain.User
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:141)
at $Proxy31.queryByID(Unknown Source)
at com.tianxiao.whut.client.ClientTest.main(ClientTest.java:22)
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:434)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:371)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:348)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:778)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:642)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156)
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:797)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1626)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1493)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1401)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:648)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
... 2 more
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:629)
at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:185)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:501)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:247)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:181)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:369)
... 22 more
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of com.tianxiao.whut.domain.User
- with linked exception:
[java.lang.InstantiationException]
... 31 more
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.sun.xml.bind.v2.ClassFactory.create0(ClassFactory.java:122)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:282)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:623)
... 28 more
请教各位大虾,这是怎么回事 ,好像变糟糕了 !!!
2011年11月25日 17:49
2个答案 按时间排序 按投票排序
-
采纳的答案
jaxb提供了有这种扩展。(CycleRecoverable接口) 解决循环引用问题,你试试:
public abstract class User implements CycleRecoverable{ //... public Object onCycleDetected(Context arg0) { Company temp = new Company (); temp.setId(id); return temp; } } public class Right { }
2011年11月25日 18:18
-
在你循环引用的对象中都实现CycleRecoverable 接口,实现onCycleDetected 方法,
当出现循环引用时,使用一个temp对象替换当前的this2011年11月25日 18:19
相关推荐
- **服务端集成**:Spring可以管理CXF的bean,例如WebService服务器实例、服务实现类等,通过Spring配置文件进行声明式配置,使得Web服务的启动和停止更加便捷。 - **客户端集成**:Spring也支持CXF的Web服务...
本实例将深入探讨如何使用Spring、CXF和Mybatis这三大框架发布Web服务。Spring作为一个强大的应用框架,可以很好地整合其他组件,如CXF(用于创建Web服务)和Mybatis(持久层框架)。以下是对这些技术结合使用的详细...
【标题】"CXF 整合 Spring 搭建Web Service"的知识点解析 在Web服务领域,CXF(CXF:曹操,CXF=Confusing eXtreme Flexibility)是一个广泛使用的开源框架,它提供了创建、部署和管理SOAP和RESTful Web服务的能力。...
在本文中,我们将深入探讨如何使用Apache CXF与Spring框架集成来开发Web Services。CXF是一个流行的开源项目,它提供了一种灵活的方式来实现和消费Web Services。Spring则是一个全面的企业级应用开发框架,两者结合...
【CXF结合Spring项目实例】是一个综合性的教程,旨在演示如何在Java开发环境中整合Apache CXF与Spring框架,实现高效、灵活的Web服务。Apache CXF是一个开源的Web服务框架,它支持SOAP、RESTful等多种服务风格,并且...
【标题】"CXF Spring Maven 实例"是一个关于如何整合并使用这些技术创建Web服务的教程。CXF是一个开源框架,主要用于构建和部署SOAP和RESTful Web服务,Spring则是一个广泛应用的Java企业级开发框架,而Maven是项目...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring框架的结合则为开发高质量的Web服务提供了强大的支持。本实例将详细阐述如何利用CXF和Spring来构建Web服务的客户端和服务端。 一、CXF简介...
本项目“cxf+spring发布webservice和restservice”专注于利用Apache CXF框架与Spring框架结合,实现这两种服务的发布。Apache CXF是一个开源的、功能丰富的服务栈,它使得开发者能够轻松地构建和部署SOAP和RESTful ...
6. **异常处理**:CXF和Spring结合时,可以利用Spring的AOP功能进行全局异常处理,统一捕获并处理Web服务调用中的异常。 7. **安全控制**:通过Spring Security或CXF自身的安全模块,可以实现对Web服务的认证和授权...
以下是使用Apache CXF结合Spring发布Web Services(Aegis数据绑定)的基本步骤: 1. **配置Spring**:首先,你需要在Spring的配置文件中引入Apache CXF的依赖,并声明一个`jaxws:endpoint`,这是CXF发布Web服务的...
3. **使用Spring管理CXF服务**:通过`@WebService`和`@WebServiceClient`注解,配合Spring的`@Service`和`@EndpointReference`注解,可以让Spring自动创建和管理CXF服务实例。 4. **部署和测试**:将Spring应用上...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring都是Java生态系统中的关键组件。本文将深入探讨如何将CXF与Spring框架整合,以构建高效且灵活的Web服务解决方案。 首先,让我们了解CXF。...
它结合了Apache CXF和Spring框架,提供了一种高效、灵活的方式来创建、发布和调用Web服务。本教程将通过一个具体的"CXF+Spring接口实例"来探讨如何使用这两种技术实现Web服务并进行测试。 首先,让我们理解CXF的...
本文将详细探讨"CXF&spring实例"中的相关知识点,包括服务端和客户端的实现,以及如何结合Spring进行配置。 首先,让我们了解一下CXF。CXF是一个开源的Java框架,主要用于构建和开发Web服务。它支持多种Web服务标准...
本教程将详细介绍如何使用CXF和Spring框架搭建一个Web服务器,并结合iBatis作为数据库访问层,以及JSON作为后台与前端页面的数据交换格式。 **一、CXF框架** CXF是一个开源的服务框架,它允许开发人员创建和部署...
2. **创建Spring配置**:在Spring的XML配置文件中声明CXF的Bus实例,然后配置服务端点和服务实现。例如: ```xml <cxf:bus> <cxf:properties> <entry key="org.apache.cxf.logging.FaultListener" value-ref=...
在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始化和配置。而Apache CXF则是一个强大的Web服务框架,用于创建和消费Web服务。本教程将详细介绍如何利用Spring Boot与CXF进行集成,以...
通过这个项目,开发者可以学习如何结合使用CXF和Spring来构建Web服务,理解服务的生命周期管理,以及如何在Tomcat这样的Servlet容器中部署和运行Java Web应用。此外,还会涉及Maven的依赖管理和构建过程,以及XML...
当将CXF与Spring结合使用时,Spring可以管理CXF组件的生命周期,使得服务的创建和发布更加容易。Spring容器可以通过XML配置或注解来管理CXF的服务端点,这样开发者无需手动创建和管理服务实例。此外,Spring的DI可以...