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

Java 尝试使用自定义JsonSerializer(Jackson)时出现Stackoverflow异常,java,json,jackson,wildfly,Java,Json,Jackson,Wildfly,我试图使用Jackson将对象序列化为JSON,以便字段名基于字段类型 我的问题与线程中的OP相同: 但是,它不起作用 我使用的是Wildfly 10.1决赛 我做了以下工作: 添加了提供给pom.xml的resteasy-jackson2依赖项 已按照我链接的帖子中的指定创建CustomSerializer类 CustomSerializer类: public class CustomSerializer extends JsonSerializer<Object> { p

我试图使用Jackson将对象序列化为JSON,以便字段名基于字段类型

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

但是,它不起作用

我使用的是Wildfly 10.1决赛

我做了以下工作:

  • 添加了提供给
    pom.xml
    resteasy-jackson2
    依赖项
  • 已按照我链接的帖子中的指定创建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();
  }
}
当我测试它时,我得到以下json对象:

{"code":0,"message":"Success","data":"test"}
因此,@JsonProperty注释可以正常工作,但自定义JsonSerializer不能正常工作

现在,我尝试了博客中的建议,并在ResponseWithReturnValue类上添加了
@JsonSerialize(使用=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)
我无法发布完整的stacktrace,因为它太长了


有什么想法吗?

您总是将委托给同一个(您的自定义)序列化程序,从而创建了一个无限递归。行
jgen.writeObject字段(value.getClass().getSimpleName(),value)
调用自定义序列化程序以序列化
对象
,该对象再次调用
jgen.writeObjectField(…)
,依此类推

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

jgen.writeObjectFieldStart("objectFieldName");
jgen.writeStringField("someValue", value.getSomeValue());
//...
jgen.writeEndObject();

serialize、serializeValue、writeValue、writeObject和writeObject字段被无限期调用,这就是导致StackOverflowException的原因,但我不确定原因是什么。堆栈溢出通常是由无限递归引起的。这就是问题的原因。在检查堆栈跟踪以调试递归问题时,请包括最上面的10-15行,标识重复部分,然后包括最下面的10-15行。
jgen.writeObjectField(value.getClass().getSimpleName(),value)看起来不对。第一个参数是fieldname,而不是类名。
jgen.writeObjectFieldStart("objectFieldName");
jgen.writeStringField("someValue", value.getSomeValue());
//...
jgen.writeEndObject();