2016-11-22 79 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调用它。这导致无尽的呼叫。