0 0

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个答案 按时间排序 按投票排序

0 0

采纳的答案

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
0 0

在你循环引用的对象中都实现CycleRecoverable 接口,实现onCycleDetected 方法,

当出现循环引用时,使用一个temp对象替换当前的this

2011年11月25日 18:19

相关推荐

    CXF Spring Web Service 程序

    - **服务端集成**:Spring可以管理CXF的bean,例如WebService服务器实例、服务实现类等,通过Spring配置文件进行声明式配置,使得Web服务的启动和停止更加便捷。 - **客户端集成**:Spring也支持CXF的Web服务...

    Spring CXF Mybatis 发布 Web Service 实例

    本实例将深入探讨如何使用Spring、CXF和Mybatis这三大框架发布Web服务。Spring作为一个强大的应用框架,可以很好地整合其他组件,如CXF(用于创建Web服务)和Mybatis(持久层框架)。以下是对这些技术结合使用的详细...

    CXF 整合 Spring 搭建Web Service

    【标题】"CXF 整合 Spring 搭建Web Service"的知识点解析 在Web服务领域,CXF(CXF:曹操,CXF=Confusing eXtreme Flexibility)是一个广泛使用的开源框架,它提供了创建、部署和管理SOAP和RESTful Web服务的能力。...

    CXF结合Spring开发WebServices示例工程

    在本文中,我们将深入探讨如何使用Apache CXF与Spring框架集成来开发Web Services。CXF是一个流行的开源项目,它提供了一种灵活的方式来实现和消费Web Services。Spring则是一个全面的企业级应用开发框架,两者结合...

    CXF结合Spring项目实例

    【CXF结合Spring项目实例】是一个综合性的教程,旨在演示如何在Java开发环境中整合Apache CXF与Spring框架,实现高效、灵活的Web服务。Apache CXF是一个开源的Web服务框架,它支持SOAP、RESTful等多种服务风格,并且...

    cxf spring maven 实例

    【标题】"CXF Spring Maven 实例"是一个关于如何整合并使用这些技术创建Web服务的教程。CXF是一个开源框架,主要用于构建和部署SOAP和RESTful Web服务,Spring则是一个广泛应用的Java企业级开发框架,而Maven是项目...

    cxf+spring开发webservice客户端与服务端实例

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring框架的结合则为开发高质量的Web服务提供了强大的支持。本实例将详细阐述如何利用CXF和Spring来构建Web服务的客户端和服务端。 一、CXF简介...

    cxf+spring发布webservice和restservice

    本项目“cxf+spring发布webservice和restservice”专注于利用Apache CXF框架与Spring框架结合,实现这两种服务的发布。Apache CXF是一个开源的、功能丰富的服务栈,它使得开发者能够轻松地构建和部署SOAP和RESTful ...

    cxf+spring实现webservice

    6. **异常处理**:CXF和Spring结合时,可以利用Spring的AOP功能进行全局异常处理,统一捕获并处理Web服务调用中的异常。 7. **安全控制**:通过Spring Security或CXF自身的安全模块,可以实现对Web服务的认证和授权...

    Apache CXF之结合Spring配置发布WebServices(Aegis数据绑定)

    以下是使用Apache CXF结合Spring发布Web Services(Aegis数据绑定)的基本步骤: 1. **配置Spring**:首先,你需要在Spring的配置文件中引入Apache CXF的依赖,并声明一个`jaxws:endpoint`,这是CXF发布Web服务的...

    cxf 结合spring所需jar包

    3. **使用Spring管理CXF服务**:通过`@WebService`和`@WebServiceClient`注解,配合Spring的`@Service`和`@EndpointReference`注解,可以让Spring自动创建和管理CXF服务实例。 4. **部署和测试**:将Spring应用上...

    cxf整合spring

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring都是Java生态系统中的关键组件。本文将深入探讨如何将CXF与Spring框架整合,以构建高效且灵活的Web服务解决方案。 首先,让我们了解CXF。...

    cxf+spring接口实例

    它结合了Apache CXF和Spring框架,提供了一种高效、灵活的方式来创建、发布和调用Web服务。本教程将通过一个具体的"CXF+Spring接口实例"来探讨如何使用这两种技术实现Web服务并进行测试。 首先,让我们理解CXF的...

    CXF&spring实例

    本文将详细探讨"CXF&spring实例"中的相关知识点,包括服务端和客户端的实现,以及如何结合Spring进行配置。 首先,让我们了解一下CXF。CXF是一个开源的Java框架,主要用于构建和开发Web服务。它支持多种Web服务标准...

    CXF Spring搭建WebServer服务器

    本教程将详细介绍如何使用CXF和Spring框架搭建一个Web服务器,并结合iBatis作为数据库访问层,以及JSON作为后台与前端页面的数据交换格式。 **一、CXF框架** CXF是一个开源的服务框架,它允许开发人员创建和部署...

    web service cxf 2.7.5 与spring 3.0 集成

    2. **创建Spring配置**:在Spring的XML配置文件中声明CXF的Bus实例,然后配置服务端点和服务实现。例如: ```xml &lt;cxf:bus&gt; &lt;cxf:properties&gt; &lt;entry key="org.apache.cxf.logging.FaultListener" value-ref=...

    Springboot整合CXF发布Web service和客户端调用(用户和密码验证)

    在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始化和配置。而Apache CXF则是一个强大的Web服务框架,用于创建和消费Web服务。本教程将详细介绍如何利用Spring Boot与CXF进行集成,以...

    cxf+spring+web

    通过这个项目,开发者可以学习如何结合使用CXF和Spring来构建Web服务,理解服务的生命周期管理,以及如何在Tomcat这样的Servlet容器中部署和运行Java Web应用。此外,还会涉及Maven的依赖管理和构建过程,以及XML...

    cxf_spring 相关 jar

    当将CXF与Spring结合使用时,Spring可以管理CXF组件的生命周期,使得服务的创建和发布更加容易。Spring容器可以通过XML配置或注解来管理CXF的服务端点,这样开发者无需手动创建和管理服务实例。此外,Spring的DI可以...

Global site tag (gtag.js) - Google Analytics