WebService 返回JPA 实体类的问题

本文探讨了在使用JPA实体类进行WebService数据传输时遇到的XML循环引用问题,并提出了解决方案,包括重新构造类和断开双向绑定。
JPA生成的实体类,例如一对一或一对多关系的时候,常常是双向绑定的,
* 当使用webService返回这种实体类的时候,特别是返回带有多级嵌套的实体类的时候,会出现如下错误
*

[com.sun.istack.SAXException2: 在对象图形中检测到循环。这将造成 XML 有无限深度: sharedb.entity.ShrResource[resourceId=1] -> sharedb.entity.ShrCategory[categroyId=2] -> sharedb.entity.ShrResource[resourceId=1]]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:282)
at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:110)
at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:178)
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:299)
... 54 more
产生这个错误的原因是entity类里你中有我我中有你的这种双向绑定造成的,而WebService向客户端发送数据之前要生成相应的XML文档,当分析实体类的时候,将发现这是个“循环”的网络,所以不能产生正确的XML文件,导致错误的产生。要解决这个问题,要么重新构造一个类要么
“断开双向绑定”,最简单的办法是将所有内部对象指向上级的连接全部断开,即设置为null;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值