2017-01-05 4 views
0

Ich habe Java-Anwendung mit Verbindung zur Datenbank mit jpa-Framework. Objekt UserInformation enthält AdditionData Objekt, wenn ich tun userInformationRepository.findByUserId(id) Fehler empfangen. Als Antwort sehe ich json mit vielen inneren ObjekteStackOverflowError beim Laden von Daten aus der Datenbank

userInformation->additionData->userInformation->userInformation->additionData->userInformation->.... 

Ausnahme:

>java.lang.StackOverflowError: null 
Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.entity.UserInformation.toString() 


java.lang.StackOverflowError: null 
    at javax.servlet.ServletResponseWrapper.getBufferSize(ServletResponseWrapper.java:167) ~[tomcat-embed-core-8.5.6.jar:8.5.6] 
    at javax.servlet.ServletResponseWrapper.getBufferSize(ServletResponseWrapper.java:167) ~[tomcat-embed-core-8.5.6.jar:8.5.6] 
    at org.springframework.security.web.util.OnCommittedResponseWrapper.checkContentLength(OnCommittedResponseWrapper.java:232) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
    at org.springframework.security.web.util.OnCommittedResponseWrapper.access$200(OnCommittedResponseWrapper.java:33) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
    at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:637) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2033) ~[jackson-core-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeRaw(UTF8JsonGenerator.java:632) ~[jackson-core-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeRaw(UTF8JsonGenerator.java:555) ~[jackson-core-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeNumber(UTF8JsonGenerator.java:931) ~[jackson-core-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.NumberSerializers$FloatSerializer.serialize(NumberSerializers.java:194) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.4.jar:2.8.4] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.4.jar:2.8.4] 

UserInformation Einheit

@Data 
@Entity(name = "user_information") 
public class UserInformation { 
    @Id 
    @Column(name = "uuid") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column(name = "user_id") 
    private Long userId; 
    @Column(name = "title", length = 64) 
    private String title; 
    @Column(name = "message", length = 128) 
    private String message; 
    @OneToOne(mappedBy = "userInformation") 
    private AdditionData additionData; 
} 

AdditionData Einheit

@Setter @Getter 
@Entity(name = "addition_data") 
public class AdditionData { 
    @Id 
    @Column(name = "uuid") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @OneToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "parent_id") 
    private UserInformation userInformation; 
} 

Repository für UserInformation Einheit

@Repository 
public interface UserInformationRepository extends CrudRepository<UserInformation, Long> { 
    List<UserInformation> findByIdIn(List<Long> ids); 
    UserInformation findByUserId(Long userId); 
} 

Warum aufgetreten Fehler? Habe ich einen Fehler in der Konfiguration für Relationen in Entity?

+1

Haben Sie die Methode 'toString()' für diese Entitäten überschrieben? –

Antwort

3

Im Allgemeinen jackson JSON Serialisierung in Probleme mit zyklischen Verbindungen. Wie die zwischen Ihren beiden Entitäten (UserInformation hat eine AdditionData, die die gleiche UserInformation usw. hat).

Fügen Sie @JsonIgnore eines der Mitglieder hinzu, um den Zyklus zu stoppen. Für eine gute Maßnahme würde ich einen Ausschluss zu Ihrer Lombok @Data Annotation hinzufügen, um das Problem zu verhindern, wenn toString() aufgerufen wird.

Die Verwendung von @JsonIgnore verhindert, dass der Spring Jackson JSON-Serializer die Referenzen durchläuft, wenn die Ausgabe als JSON generiert wird. Da dieser Prozess rekursiv ist (Mitglieder werden auch nach json serialisiert), verhindert das Verhindern des Eintauchens in diese Referenzen auch, dass die StackOverflowException ausgelöst wird.

+0

danke für die Antwort, ich entferne '@ Data' und fügte' @ Getter' '@ Setter' Annotation hinzu, aber es löst nicht das Problem, aber warum? Mit '@ JsonIgnore' funktioniert es perfekt. –

+0

Hinzugefügt einige Details, die ich hoffe, werde meine Antwort etwas klären. – CollinD

+0

Danke, du hast mir wirklich geholfen! –

Verwandte Themen