package com.fasterxml.jackson.datatype.jdk8;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;

BeanSerializerModifier needed to sneak in handler to exclude "absent" optional values iff handling of "absent as nulls" is enabled.
/** * {@link BeanSerializerModifier} needed to sneak in handler to exclude "absent" * optional values iff handling of "absent as nulls" is enabled. */
public class Jdk8BeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); ++i) { final BeanPropertyWriter writer = beanProperties.get(i); JavaType type = writer.getType(); Object empty; if (type.isTypeOrSubTypeOf(Optional.class)) { empty = Optional.empty(); } else if (type.hasRawClass(OptionalLong.class)) { empty = OptionalLong.empty(); } else if (type.hasRawClass(OptionalInt.class)) { empty = OptionalInt.empty(); } else if (type.hasRawClass(OptionalDouble.class)) { empty = OptionalDouble.empty(); } else { continue; } beanProperties.set(i, new Jdk8OptionalBeanPropertyWriter(writer, empty)); } return beanProperties; } }