@JsonInclude is ignored when using BeanSerializerModifier

116 views
Skip to first unread message

Rj Ewing

unread,
Jan 16, 2017, 9:05:51 PM1/16/17
to jackson-user
I have written a custom JsonSerializer to allow overriding of json views using a custom 
@JsonViewOverride
annotation. Everything is working as expected except for 1 minor detail. Properties with null values are not being serialized. I have the default settings for
@JsonInclude
and have tried to add the annotation    
@JsonInclude(JsonInclude.Include.ALWAYS)
.

If I don't register my BeanSerializerModifier, @Jsoninclude annotation is used. Any ideas why this might be happening and how to fix it?

Serializer.class
public class JsonViewOverrideSerializer extends JsonSerializer implements ContextualSerializer {
    private final JsonSerializer beanSerializer;
    private final Class overrideView;

    public JsonViewOverrideSerializer(JsonSerializer<?> serializer) {
        this(serializer, null);
    }

    public JsonViewOverrideSerializer(JsonSerializer<?> serializer, Class<?> overrideView) {
        this.beanSerializer = serializer;
        this.overrideView = overrideView;
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        SerializerProvider effectiveProvider = provider;

        if (overrideView != provider.getActiveView()) {
            effectiveProvider = overrideProvider(overrideView, gen, provider);
        }

        beanSerializer.serialize(value, gen, effectiveProvider);
    }

    private SerializerProvider overrideProvider(Class<?> overrideView, JsonGenerator gen, SerializerProvider provider) {
        return ((DefaultSerializerProvider) provider).createInstance(provider.getConfig().withView(overrideView), ((ObjectMapper) gen.getCodec()).getSerializerFactory());
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        JsonSerializer<?> serializer = this.beanSerializer;

        if (serializer instanceof ContextualSerializer) {
            serializer = ((ContextualSerializer) serializer).createContextual(prov, property);
        }

        if (property != null) {
            JsonViewOverride jsonViewOverride = property.getAnnotation(JsonViewOverride.class);

            if (jsonViewOverride != null) {
                Class<?> jsonView = jsonViewOverride.value();
                serializer = new JsonViewOverrideSerializer(serializer, jsonView);
            }
        }

        return serializer;
    }
}

BeanSerializerModifier:
public class MySerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        return new JsonViewOverrideSerializer(serializer);
    }
}

ObjectMapper:
    public SpringObjectMapper() {
        Hibernate5Module hm = new Hibernate5Module();
        hm.configure(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION, false);
        this.registerModule(hm);
        this.enable(SerializationFeature.INDENT_OUTPUT);
        this.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        this.registerModule(
                new SimpleModule()
                        .setSerializerModifier(new FimsSerializerModifier())
        );
    }



Tatu Saloranta

unread,
Jan 16, 2017, 11:07:21 PM1/16/17
to jackson-user
Ignored in what way? What is happening? What does your
`JsonViewOverrideSerializer` look like?

One common problem is that all delegating serializers MUST implement
`ResolvableSerializer` and `ContextualSerializer`, and delegate them
to underlying serializer -- otherwise that instance can not be
re-configured with annotations. This may be what is happening in your
case.
It may be worthwhile to have a look at `StdDelegatingSerializer` to
see how it handles this.

-+ Tatu +-
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to jackson-user...@googlegroups.com.
> To post to this group, send email to jackso...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Rj Ewing

unread,
Jan 16, 2017, 11:16:39 PM1/16/17
to jackson-user
The problem was I didn't implement ResolvableSerializer. 

null properties weren't being serialized, but now they are.

Thanks,
RJ
Reply all
Reply to author
Forward
0 new messages