2016-11-22 3 views
1

Ich habe eine Klasse wie:Jacksons ObjectMapper innen Individuelle Verwendung Klasse

@Data 
public class Lmao { 
    String lol; 
    String lel; 

    public String getJsonString() throws Exception { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     return objectMapper.writeValueAsString(this); 
    } 
} 

Allerdings, wenn ich die getJsonString() Methode aufrufen, erhalte ich folgende Fehlermeldung:

java.lang.StackOverflowError 
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass._findFields(AnnotatedClass.java:795) 
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass._findFields(AnnotatedClass.java:802) 
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveFields(AnnotatedClass.java:571) 
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass.fields(AnnotatedClass.java:353) 
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addFields(POJOPropertiesCollector.java:350) 
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:283) 
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getJsonValueMethod(POJOPropertiesCollector.java:169) 
    at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findJsonValueMethod(BasicBeanDescription.java:223) 
    at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.findSerializerByAnnotations(BasicSerializerFactory.java:349) 
    at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:208) 
    at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:157) 
    at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1215) 
    at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1167) 
    at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:490) 
    at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:688) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:107) 
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3613) 
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2980) 

Gibt es trotzdem kann ich Rufe Jacksons ObjectMapper in der Klasse selbst auf, damit ich die Json String besser mit dem Objekt selbst verbinden kann?

Bearbeiten: Ich habe vergessen zu erwähnen, dass ich Lomboks Daten hier verwende, so dass die Setter und Getters für jede einzelne Eigenschaft nicht benötigt wird.

Antwort

1

Sicher, aber Sie müssen es die JsonString-Eigenschaft ignorieren, um diesen endlosen rekursiven Aufruf zu vermeiden. Fügen Sie dem Getter @JsonIgnore hinzu. Oder benennen Sie Ihre Methode so, dass sie keine Eigenschaft mehr ist, wie zum Beispiel toJson() (was auch ein besserer Name ist, IMO).

Das heißt, das Erstellen eines neuen ObjectMapper ist keine gute Idee. Sie sollten stattdessen auch das gleiche wiederverwenden, das ein für allemal konstruiert wurde.

+0

Es wird nicht funktionieren, da Felder anscheinend nicht "Getters" und "Setter" haben. Es wird 'JsonMappingException' geworfen. –

+0

Danke für die Antwort (auch an alle anderen). Ich entschied mich, dieser Antwort das Häkchen zu geben, weil es die erste Antwort war und gab auch einige Tipps für das Objektdesign. – SnG

1

Sie müssen folgendes tun:

  • schreiben Getter und Setter
  • Beschriften getJsonString mit @JsonIgnore

Unten funktionieren sollte:

public class Test { 

    String lol; 
    String lel; 

    @JsonIgnore 
    public String getJsonString() throws Exception { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     return objectMapper.writeValueAsString(this); 
    } 

    public String getLol() { 
     return lol; 
    } 


    public void setLol(String lol) { 
     this.lol = lol; 
    } 


    public String getLel() { 
     return lel; 
    } 


    public void setLel(String lel) { 
     this.lel = lel; 
    } 

    public static void main(String[] args) throws Exception{ 
     Test t = new Test(); 
     System.out.println(t.getJsonString()); 
    } 
} 
1

benennen Sie Ihre getJsonString()-toJsonString() .

ObjectMapper denkt, es gibt eine Eigenschaft jsonString in Ihrer Bohne. Es versucht, es über Getter zu nennen. Dies führt zu einem endlosen Anruf.

Verwandte Themen