2016-11-22 81 views
1

我有一個類,如:使用傑克遜的ObjectMapper內自定義

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

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

然而,當我調用getJsonString()方法,我得到以下錯誤:

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) 

反正是有,我可以在類內部調用Jackson的ObjectMapper,以便我可以更好地將Json字符串與對象本身綁定在一起?

編輯:我忘了提,我使用的龍目島的數據在這裏,所以每一個人財產的心不是的getter和setter方法需要。

回答

1

當然,但你需要使它忽略jsonString財產,以避免無休止的遞歸調用。給吸氣劑添加@JsonIgnore。或名稱的方法,以便它不是財產了,例如像toJson()(這也是一個更好的名字,IMO)。

也就是說,創建一個新的ObjectMapper每次是不是一個好主意。你應該重複使用同一個,一勞永逸。

+0

它不會工作,因爲領域似乎沒有'getters'和'setters'。它會拋出'JsonMappingException'。 –

+0

謝謝你的回答(也適用於其他人)。我決定給這個答案複選標記,因爲這是第一個答案,並且還提供了一些關於對象設計的提示。 – SnG

1

你需要做到以下幾點:與@JsonIgnore

下面應該工作

  • 寫getter和setter方法
  • 註釋getJsonString

    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

重命名getJsonString()toJsonString()

ObjectMapper認爲有在bean的屬性jsonString。它嘗試通過getter調用它。這導致無盡的呼叫。