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>
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du sagst, du bist mit Jackson 2.1.4, aber der stacktrace zeigt Jackson mit Pakete beginnen mit "
org.codehaus.jackson
" was ist das Basis-Paket für Jackson 1.x. Das Basis-Paket für Jackson 2.x ist "com.fasterxml.jackson
". Jersey ist daher konfiguriert, mit Jackson 1.x (wahrscheinlich 1.9.2, wie der Standard in Jersey 1.17). Meine Vermutung ist, dass Sie sind, kommentieren Sie Ihren code mit Anmerkungen importiert aus Jackson 2.x aber die Jackson-Bibliothek verwendet, die von Jersey ist nicht bewusst von denen, und so versagt zu serialisieren.Dein code funktioniert gut für mich mit Jackson 2.3.0.
InformationsquelleAutor Ophir Radnitz
Für eine zwei-Wege-Kopplung zwischen Bereichen, sollten Sie einen Blick auf die @JsonManagedReference und @JsonBackReference Anmerkungen.
ich glaube nicht, dass dieses Verhalten kann erreicht werden mit dem @ - JsonIdentifyInfo an alle....
Finden Sie weitere Beispiele hier.
Danke für den link, ich wusste nicht, dass.
hmmm, ich kann es nicht zu funktionieren mit der JsonManagedReference und JsonBackReference Anmerkungen entweder, vielleicht gibt es etwas falsch mit meinem Projekt-Konfigurationen...
InformationsquelleAutor nutlike