I deal with some circular references when implementing the web service level of the project. I use jaxb (latest version, 2.2.7), and even I looked at some tips like here and here. I can't get it to work. This is the basic SSCCE about my problem:
@WebService public interface IMyWS { @WebMethod public List<Class1> cyclicTest(); } @WebService(endpointInterface = "com.mycompany.ws.interfaces.IMyWS") public class MyWS implements IMyWS { @XmlRootElement public static class Class1 { @XmlTransient private Class2 class2; public Class1() { } public Class1(Class2 refClass) { class2 = refClass; } public Class2 getClass2() { return class2; } public void setClass2(Class2 class2) { this.class2 = class2; } @Override public String toString() { return this.getClass().getSimpleName(); } } @XmlRootElement public static class Class2 { private Class1 class1; public Class2() { } public Class1 getClass1() { return class1; } public void setClass1(Class1 class1) { this.class1 = class1; } @Override public String toString() { return this.getClass().getSimpleName(); } } @Override public List<Class1> cyclicTest() {
And the exception that I encountered when calling cyclicTest() :
Caused by: javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.SAXException2: Se ha detectado un ciclo en el gráfico de objeto. Esto provocará un XML con profundidad infinita: Class1 -> Class2 -> Class1] at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326) at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:178) at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:537) at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:233) ... 50 more Caused by: com.sun.istack.SAXException2: Se ha detectado un ciclo en el gráfico de objeto. Esto provocará un XML con profundidad infinita: Class1 -> Class2 -> Class1 at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:249) at com.sun.xml.bind.v2.runtime.XMLSerializer.pushObject(XMLSerializer.java:537) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:631) at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:156) at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:131) at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:333) at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:340) at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76) at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) ... 53 more
I think I have relevant annotations. What am I missing?
source share