当前位置: 首页 > 知识库问答 >
问题:

尝试使用自定义JsonSerializer(Jackson)时发生Stackoverflow异常

巫马星雨
2023-03-14

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

我有和这个线程中的OP一样的问题:

然而,这并不奏效。

我正在使用Wildfly 10.1 Final

    null

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”)注释添加到object字段,因此我的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"}
    

    现在,我尝试了本博客中的建议,并在我的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)
    

    我无法发布完整的stacktrace,因为它太长了。

    有什么想法吗?

  • 共有1个答案

    郜振国
    2023-03-14

    通过始终委托给相同的(自定义的)序列化程序,您已经创建了无限递归。行jgen.writeobjectfield(value.getClass().getSimplename(),value);调用自定义序列化程序,以序列化object,后者再次调用jgen.writeobjectfield(...)等等。

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

    jgen.writeObjectFieldStart("objectFieldName");
    jgen.writeStringField("someValue", value.getSomeValue());
    //...
    jgen.writeEndObject();
    
     类似资料:
    • 问题内容: 我以下列方式使用ModelMapper: 我有一些转换器类是Spring组件,它们注册了自定义ModelMapper映射 但是当Spring启动时出现以下错误,因为配置函数被调用并且源为null。 那应该如何工作? 我使用错了吗? 像这样声明bean,并且Foo和FooModel不是最终的 重要编辑 实际上,即使当我在主类中的函数中显式创建映射时,我也会得到相同的NullPointer

    • 我编写了以下来让Jackson将一个数组的整数序列化为JSON: 此处使用该类: 我想测试序列化程序的行为,并得出以下结论: 但是,不向写入任何内容。我做错了什么?

    • 问题内容: 我创建了一个自定义SSLSocketFactory类,并将其设置如下 从Eclipse Dev Environment运行并在命令提示符下将其作为Jar文件运行时,它可以正常工作。但是,当我将其包装在服务包装中并作为Windows Service启动时,它不起作用。我收到以下异常, 任何帮助??? 问题答案: 自从我发布此问题以来已经很长时间了。由于这篇文章没有任何答案,而且似乎也有一

    • Jackson序列化到JSON有一些很好的特性,比如SerializationFeature.write_null_map_values,它允许您避免将null写入序列化对象。 但是,如果我使用自定义的JsonSerializer,这个设置将被忽略,并且我被迫在对WriteStringField的所有调用中进行空检查。例如,我注册了一个自定义的JSONSerializer: 然后在ImportPr

    • 问题内容: 我正在使用以下时间戳格式: 以下方法可以正常工作: 而且,当我使用该格式字符串传递时间戳时,它返回,例如: 然后,我需要再次从该字符串映射到时间戳,本质上是相反的操作。我知道我可以使用和及其方法,但是如果可能的话,我宁愿坚持使用样式格式。 我写了这段代码(相当hacky),它适用于某些格式,但不适用于特定格式: 在第二部分,它失败了。 堆栈跟踪: 有没有一种更简单的方法可以在不利用我的

    • 我还更新了相关的XML文件,其中提到了spring security bean。我在用Postgres数据库。而且,在我的系统中,一切都运行良好,当我将这些更改提交到QA环境时,登录不工作。我在登录到应用程序时检查了日志,它显示了一些错误。这是日志 还有,如何检查ubuntu服务器中的PostgreSQL JDBC驱动程序版本?有人能帮我解决这个问题吗?谢谢