
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