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



-- 
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+unsubscr...@googlegroups.com.
To post to this group, send email to jackson-user@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to