All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sprint.framework.web.config.HttpMessageConverterWebConfiguration Maven / Gradle / Ivy

The newest version!
package com.sprint.framework.web.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.sprint.common.converter.conversion.nested.json.JacksonMapper;
import com.sprint.common.converter.conversion.nested.json.databind.JacksonDateFormat;
import com.sprint.common.microkernel.extension.factory.support.SpringServiceFactory;
import com.sprint.framework.core.common.utils.Safes;
import com.sprint.framework.web.support.json.CommonWebConfigurer;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.http.converter.*;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.SpringHandlerInstantiator;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
import org.springframework.util.ClassUtils;
import org.springframework.util.StreamUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import javax.annotation.Nonnull;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLResolver;
import java.util.Collections;
import java.util.List;

/**
 * @author hongfeng.li
 * @since 2023/3/1
 */
public class HttpMessageConverterWebConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware {

    private static final boolean jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
            AllEncompassingFormHttpMessageConverter.class.getClassLoader())
            && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
                    AllEncompassingFormHttpMessageConverter.class.getClassLoader());

    private static final boolean jackson2XmlPresent = ClassUtils.isPresent(
            "com.fasterxml.jackson.dataformat.xml.XmlMapper",
            AllEncompassingFormHttpMessageConverter.class.getClassLoader());

    private List configurers = Collections.emptyList();

    @Autowired(required = false)
    public void setConfigurers(List configurers) {
        if (configurers == null || configurers.isEmpty()) {
            return;
        }
        this.configurers = configurers;
    }

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(@Nonnull ApplicationContext applicationContext) throws BeansException {
        SpringServiceFactory.addApplicationContext(applicationContext);
        this.applicationContext = applicationContext;
    }

    @Override
    public void configureMessageConverters(List> converters) {
        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
        stringConverter.setWriteAcceptCharset(false);

        converters.add(new ByteArrayHttpMessageConverter());
        converters.add(stringConverter);
        converters.add(new ResourceHttpMessageConverter());
        converters.add(new SourceHttpMessageConverter<>());
        converters.add(new AllEncompassingFormHttpMessageConverter());

        if (jackson2XmlPresent) {
            ObjectMapper objectMapper = new XmlObjectMapperInitializer().create();
            converters.add(new MappingJackson2XmlHttpMessageConverter(configure(objectMapper)));
        } else {
            converters.add(new Jaxb2RootElementHttpMessageConverter());
        }

        if (jackson2Present) {
            ObjectMapper objectMapper = new ObjectMapperInitializer().create();
            converters.add(new MappingJackson2HttpMessageConverter(configure(objectMapper)));
        }
    }

    private ObjectMapper configure(ObjectMapper objectMapper) {
        objectMapper.setHandlerInstantiator(
                new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory()));

        JacksonMapper.configure(objectMapper, false, JacksonDateFormat.PATTERN_YYYYMMDDHHMMSS);

        for (CommonWebConfigurer configurer : Safes.of(configurers)) {
            configurer.extendJacksonHttpMessageConverter(objectMapper);
        }

        return objectMapper;
    }

    private static class XmlObjectMapperInitializer {

        private static final XMLResolver NO_OP_XML_RESOLVER = new XMLResolver() {
            @Override
            public Object resolveEntity(String publicID, String systemID, String base, String ns) {
                return StreamUtils.emptyInput();
            }
        };

        private static XMLInputFactory xmlInputFactory() {
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
            inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
            inputFactory.setXMLResolver(NO_OP_XML_RESOLVER);
            return inputFactory;
        }

        public ObjectMapper create() {
            return new XmlMapper(xmlInputFactory());
        }
    }

    private static class ObjectMapperInitializer {

        public ObjectMapper create() {
            return new ObjectMapper();
        }
    }

    static class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {

        public AllEncompassingFormHttpMessageConverter() {
            addPartConverter(new SourceHttpMessageConverter<>());

            if (jackson2Present) {
                ObjectMapper objectMapper = new ObjectMapperInitializer().create();
                addPartConverter(new MappingJackson2HttpMessageConverter(objectMapper));
            }

            if (jackson2XmlPresent) {
                ObjectMapper objectMapper = new XmlObjectMapperInitializer().create();
                addPartConverter(new MappingJackson2XmlHttpMessageConverter(objectMapper));
            } else {
                addPartConverter(new Jaxb2RootElementHttpMessageConverter());
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy