文档章节

springboot加载自定义MessageConverter

呵呵3547
 呵呵3547
发布于 2016/07/20 13:02
字数 481
阅读 389
收藏 2

想通过fastjson解析springmvc返回的自定义数据类型

  1. 实现类AbstractHttpMessageConverter
public class ResultMessageConverter extends AbstractHttpMessageConverter<ResultInfo> {   
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
	private Logger logger = LoggerFactory.getLogger(ResultMessageConverter.class);
	public ResultMessageConverter() {
		super(new MediaType("text", "html", DEFAULT_CHARSET), new MediaType("application", "json", DEFAULT_CHARSET));
	}
	@Override
	public boolean canRead(Class<?> clazz, MediaType mediaType) {
		return false;
	}
	@Override
	public boolean canWrite(Class<?> clazz, MediaType mediaType) {
		return true;
	}
	@Override
	protected boolean supports(Class<?> clazz) {
		return Response.class.isAssignableFrom(clazz);
	}
	@Override
	protected ResultInfo readInternal(Class<? extends ResultInfo> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException {
		String requestData = StreamUtils.copyToString(inputMessage.getBody(), DEFAULT_CHARSET);
		System.out.print(requestData);
		return null;
	}
	@Override
	protected void writeInternal(ResultInfo resultInfo, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException {
		HttpServletRequest httpRequest = getHttpRequest();
		Holder holder = (Holder)httpRequest.getAttribute(Holder.Key.HOLDER.getKey());
		Response response = toResponse(resultInfo, holder);
		String jsondata = DataUtils.response2json(response);
		LogUtils.info(jsondata, logger);
		//String newjson = URLEncoder.encode(jsondata, "UTF-8");
		outputMessage.getHeaders().setContentType(new MediaType("application", "json", DEFAULT_CHARSET));
		StreamUtils.copy(jsondata, DEFAULT_CHARSET, outputMessage.getBody());
        //outputMessage.getBody().write(jsondata.getBytes());
	}
	private Response toResponse(ResultInfo resultInfo, Holder holder) {
		if (holder != null) {
			return Response.Builder.create(holder.getValue(Holder.Key.TRANCEID), resultInfo);
		}
		return Response.Builder.create(UUID.randomUUID().toString(), resultInfo);
	}
	private HttpServletRequest getHttpRequest() {
		return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
	}
  1. 注册到springboot注册的messageConverter中
@Configuration
public class BaseMVCConfiguration extends WebMvcConfigurerAdapter {

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> messageConverter : converters) {
            System.out.println("message converter " + messageConverter); //2
        }
    }

    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        ResultMessageConverter resultConverter = new ResultMessageConverter();
        converters.add(0, resultConverter);
        for (HttpMessageConverter<?> messageConverter : converters) {
            System.out.println("message converter " + messageConverter); //2
        }
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new BaseInterceptor());
        super.addInterceptors(registry);
    }
}

. 注册MessageConverter时需要注册converters.add(0, resultConverter) 因为springboot会默认加载jackson进行解析json,springboot是按顺序查询的.如果是用converters.add(resultConverter)自定义的Messageconverter是在jackson之后.可能会先使用jackson进行解析

. 另一种方法是在maven依赖包中去除jackson的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
		</exclusion>
	</exclusions>
</dependency>

查看springboot源码类WebMvcConfigurationSupport中方法addDefaultHttpMessageConverters时

protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
		StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
		stringConverter.setWriteAcceptCharset(false);

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

		if (romePresent) {
			messageConverters.add(new AtomFeedHttpMessageConverter());
			messageConverters.add(new RssChannelHttpMessageConverter());
		}

		if (jackson2XmlPresent) {
			ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext(this.applicationContext).build();
			messageConverters.add(new MappingJackson2XmlHttpMessageConverter(objectMapper));
		}
		else if (jaxb2Present) {
			messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
		}

		if (jackson2Present) {
			ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
			messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
		}
		else if (gsonPresent) {
			messageConverters.add(new GsonHttpMessageConverter());
		}
	}

变量的声明如下

private static final boolean jaxb2Present =
			ClassUtils.isPresent("javax.xml.bind.Binder", WebMvcConfigurationSupport.class.getClassLoader());

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

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

private static final boolean gsonPresent =
			ClassUtils.isPresent("com.google.gson.Gson", WebMvcConfigurationSupport.class.getClassLoader());

© 著作权归作者所有

共有 人打赏支持
呵呵3547
粉丝 1
博文 5
码字总数 1461
作品 0
昌平
程序员
私信 提问
【SpringBoot专题】快速体验

前言 在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正是因为这些问题,Spring开...

张丰哲
2018/08/05
0
0
007SpringBoot之配置文件加载的优先级以及位置

一、基础 1、定义 之前我们的文件都放到了下,然后SpringBoot项目启动后会自动读取并加载,那么这个文件放在哪呢?只能放到下吗?不是。 2、位置以及优先级 SpringBoot启动后会扫描以下位置的...

编程界的小学生
2018/05/28
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉
2018/06/23
0
0
Spring Boot干货系列: (三)启动原理解析

     前言   前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步...

后端编程嘟
2017/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Golang中Int32转换为int16丢失精度的具体过程

1.类型转换代码 Int32转换为int16会丢失精度,这是总所周知的,但是具体如何丢失精度的,请看下面的代码: var tmp1 int32 = 123424021var tmp2 int16var tmp3 uint16tmp2 = int16(tmp1)...

cloes
23分钟前
1
0
原生Servlet文件上传和下载Servlet多个文件上传

转载:原文连接https://blog.csdn.net/HaHa_Sir/article/details/81744629一、前端 html 代码<center> <h2> 基于servelt 3.0注解实现文件上传 </h2> <h3>1、单个文件上传</h......

小橙子的曼曼
28分钟前
1
0
JDBC流程

简述

细节探索者
35分钟前
0
0
利用位运算实现加减乘除

利用位运算实现加减乘除 受《剑指offer》上题目的启发,现在把利用位运算做加、减、乘、除的方法总结一下。 参考网址:https://blog.csdn.net/sinat_35261315/article/details/72904945 基础...

薛定谔的旺
39分钟前
4
0
mysql——通过命令将sql查询的结果导出到具体文件

mysql——通过命令将sql查询的结果导出到具体文件 2018年07月29日 21:53:51 郑浩- 阅读数:2949 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013045437/a...

linjin200
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部