Nicht das @JsonIdentityInfo annotation zu arbeiten

Habe ich eine bidirektionale Beziehung zwischen zwei Objekten. Ich habe einen RESTful Web Service mit Jersey 1.17 und Jackson 2.1.4. Ich bin auch mit dem @JsonIdentityInfo annotation (in einer falschen Art und Weise, scheinbar!) stoppen Sie die Json aus immer in einem unendlichen Kreislauf. Jedoch ist das erzeugte Json ist immer noch eine Endlosschleife zwischen den beiden Objekten.

Das erste Objekt ist:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class Child {

    private long value;
    private Parent parent;

    public long getValue() {
        return this.value;
    }

    public void setValue(long value) {
        this.value = value;
    }

    public Parent getParent() {
        return this.parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }

}

Das zweite Objekt ist:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class Parent {

    private long value;
    private Set<Child> childs = new HashSet<Child>(0);

    public long getValue() {
        return this.value;
    }

    public void setValue(long value) {
        this.value = value;
    }

    public Set<Child> getChilds() {
        return this.childs;
    }

    public void setChilds(Set<Child> childs) {
        this.childs = childs;
    }

}

Und hier ist die Methode, die die Generierung der Json.

@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Child getChild() {

    Child child = new Child();
    Parent parent = new Parent();
    child.setValue(1L);
    parent.setValue(2L);
    child.setParent(parent);
    Set<Child> childs = new HashSet<Child>(0);
    childs.add(child);
    parent.setChilds(childs);
    return child;

}

EDIT:

Die daraus resultierende Json sieht wie folgt aus:

{"value":1,"parent":{"value":2,"childs":[{"value":1,"parent":{"value":2,"childs":[...

Und diese 9 Linien wurden wiederholt in den server-log-Datei über und über...

at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:72)
at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)

Und die web.xml die Datei sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">
  <display-name>Jersey REST Service</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>test</param-value>      
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>
 </web-app> 
Könntest du (Teile) der resultierende JSON, die geworfene exception (falls vorhanden) oder somethink wie?
Ich habe das Ergebnis JSON und der ausgelösten Ausnahme ist (was ich glaube ist wegen der vorhandenen Schleife)...
Ich habe nie verwendet-Jersey-so ist meine Pure Vermutung wäre, dass alle Jackson-Anmerkungen werden ignoriert in Ihrem Projekt. Könnten Sie das bestätigen (oder widerlegen), dass mit einem kleineren Beispiel? Von dem, was ich bisher gelesen web.xml von Interesse sein könnten in diesem Fall sollten Sie vielleicht fügen Sie diese zu Ihrer Frage.
Nun, es scheint ein problem mit der version von Jackson, den ich bin mit, verursachen, wenn ich die 1.9.2 version, die JsonManagedReference und JsonBackReference Anmerkungen arbeiten, aber die daraus resultierende JSON "{"Wert":1}" ist nicht gut, denn es ist das ignorieren der Eltern völlig...

InformationsquelleAutor bbkglb | 2013-03-14

Schreibe einen Kommentar