Jackson2BuilderCustomizer.java

package top.infra.jackson2;

import static com.google.common.collect.Lists.newLinkedList;

import com.fasterxml.jackson.databind.Module;

import org.springframework.core.Ordered;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.lang.reflect.Field;
import java.util.List;

/**
 * Created by zhanghaolun on 16/7/28.
 */
public interface Jackson2BuilderCustomizer extends Ordered {

    void customize(Jackson2Properties properties, Jackson2ObjectMapperBuilder builder);

    default boolean createXmlMapper(final Jackson2ObjectMapperBuilder builder) {
        try {
            final boolean result;
            final Field fieldModules = builder.getClass().getDeclaredField("createXmlMapper");
            fieldModules.setAccessible(true);
            result = (boolean) fieldModules.get(builder);
            return result;
        } catch (final NoSuchFieldException | IllegalAccessException | IllegalArgumentException ex) {
            return false;
        }
    }

    default Boolean isXmlMapper(final Jackson2ObjectMapperBuilder builder) {
        return this.createXmlMapper(builder);
    }

    default ClassLoader moduleClassLoader(final Jackson2ObjectMapperBuilder builder) {
        try {
            final ClassLoader result;
            final Field fieldModuleClassLoader = builder.getClass().getDeclaredField("moduleClassLoader");
            fieldModuleClassLoader.setAccessible(true);
            result = (ClassLoader) fieldModuleClassLoader.get(builder);
            return result;
        } catch (final NoSuchFieldException | IllegalAccessException | IllegalArgumentException ex) {
            return builder.getClass().getClassLoader();
        }
    }

    @SuppressWarnings("unchecked")
    default List<Module> modules(final Jackson2ObjectMapperBuilder builder) {
        try {
            final List<Module> result;
            final Field fieldModules = builder.getClass().getDeclaredField("modules");
            fieldModules.setAccessible(true);
            result = (List<Module>) fieldModules.get(builder);
            return newLinkedList(result);
        } catch (final NoSuchFieldException | IllegalAccessException | IllegalArgumentException ex) {
            return newLinkedList();
        }
    }
}