0

I am trying to serialize the object to JSON using Jackson, so that the field name is based on a type of field.

I have the same problem as the OP in this thread:

However, it's not working.

I am using Wildfly 10.1 Final

I did the following:

  • added resteasy-jackson2 dependency as provided to pom.xml.
  • Created CustomSerializer class as specified in the post I linked.

CustomSerializer class:

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();
  }
}
  • Added @JsonProperty("data") annotation to the object field, so my Response class now looks like this:

    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;
        }
    }
    

When I test it I get the following json object:

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

So, the @JsonProperty annotation is working but the custom JsonSerializer isn't.

Now, I tried what was suggested in this blog, and added @JsonSerialize(using=CustomSerializer.class) annotation on my ResponseWithReturnValue class.

However, now I get this StackOverflow :) exception:

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)

I wasn't able to post full stacktrace because it's way too long.

Any ideas?

chenrui
  • 8,910
  • 3
  • 33
  • 43
user3362334
  • 1,980
  • 3
  • 26
  • 58
  • Well, serialize, serializeValue, writeValue, writeObject and writeObjectField are called indefinitely, so that's what's causing StackOverflowException, but I'm not sure what's the cause. – whatamidoingwithmylife Dec 07 '17 at 01:43
  • Stack overflow is often caused by infinite recursion. This is the cause of your problem. – DwB Dec 08 '17 at 16:30
  • When reviewing a stack trace to debug a recursion issue, include the top 10 - 15 lines, identify the repeating parts, then include the bottom 10 - 15 lines. – DwB Dec 08 '17 at 16:33
  • `jgen.writeObjectField(value.getClass().getSimpleName(), value);` looks wrong. The first parameter is fieldname, not class name. – DwB Dec 08 '17 at 16:36

1 Answers1

2

You have created an infinite recursion by always delegating to the same (your custom) serializer. The line jgen.writeObjectField(value.getClass().getSimpleName(), value); calls your custom serializer in order to serialize Object, which again calls jgen.writeObjectField(...) and so on.

You can delegate to another serializer or actually serialize the object:

jgen.writeObjectFieldStart("objectFieldName");
jgen.writeStringField("someValue", value.getSomeValue());
//...
jgen.writeEndObject();
Christian
  • 295
  • 2
  • 6