尝试使用自定义JsonSerializer(Jackson)时出现Stackoverflow异常

时间:2017-12-07 01:39:21

标签: java json jackson wildfly

我正在尝试使用Jackson将对象序列化为JSON,以便字段名称基于一种字段。

我遇到与this线程中的OP相同的问题:

然而,它无法正常工作。

我正在使用Wildfly 10.1 Final

我做了以下事情:

  • resteasy-jackson2提供了pom.xml依赖项。
  • 创建 CustomSerializer 类,如我链接的帖子中所指定。

CustomSerializer类:

public class CustomSerializer extends JsonSerializer<Object> {
  public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeObjectField(value.getClass().getSimpleName(), value);
    jgen.writeEndObject();
  }
}
  • 在对象字段中添加了@JsonProperty("data")注释,因此我的Response类现在看起来像这样:

    public class ResponseWithReturnValue extends Response {
        @JsonProperty("data")
        private Object object;
    
        public ResponseWithReturnValue (int code, String msg) {
            super(code, msg);
        }
    
        public Object getObject() {
            return object;
        }
    
        public void setObject(Object object) {
            this.object = object;
        }
    }
    

当我测试它时,我得到以下json对象:

{"code":0,"message":"Success","data":"test"}

因此, @JsonProperty 注释正在运行,但自定义JsonSerializer不是。

现在,我尝试了this博客中的建议,并在我的 ResponseWithReturnValue 类中添加了@JsonSerialize(using=CustomSerializer.class)注释。

但是,现在我得到了这个StackOverflow :)异常:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.Class.getEnclosingMethodInfo(Class.java:1072)
at java.lang.Class.getEnclosingClass(Class.java:1272)
at java.lang.Class.getSimpleBinaryName(Class.java:1443)
at java.lang.Class.getSimpleName(Class.java:1309)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)
at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:324)
at com.fasterxml.jackson.core.JsonGenerator.writeObjectField(JsonGenerator.java:1415)
at rs.netset.authority.web.facade.utils.CustomSerializer.serialize(CustomSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2383)

我无法发布完整的堆栈跟踪,因为它太长了。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您通过始终委托给相同(您的自定义)序列化程序创建了无限递归。第{ "from": 0, "size": 50, "query": { "filtered": { "query": { "bool": { "should": [ { "multi_match": { "query": "muc", "fields": [ "name", "sector.group.name", "description", "professionDescription" ] } }, { "term": { "alternate": "true" } }, { "term": { "flagDistance": "true" } } ], "must": [], "minimum_should_match": 2 } }, "filter": { "bool": { "should": { "geo_distance": { "distance": "80km", "institute.location": { "lat": "48.866667", "lon": "2.333333" } }, "term": { "flagDistance": "true" } } } } } }, "track_scores": true, "sort": { "institute.premium": { "order": "desc" }, "_geo_distance": { "location": { "lat": "48.866667", "lon": "2.333333" } } } } 行调用您的自定义序列化程序,以便序列化jgen.writeObjectField(value.getClass().getSimpleName(), value);,再次调用Object,依此类推。

您可以委派给另一个序列化程序或实际序列化该对象:

jgen.writeObjectField(...)