<p>HttpMessageConverter是Spring的一个重要接口,它负责将请求信息转换为一个对象,将对象输出为响应信息。<br/><br/>DispatcherServlet默认已经安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类,HttpMessageConverter即由RequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。<br/><br/>HttpMessageConverter接口定义了以下几个方法。<br/><br/>① Boolean canRead(Class<?> clazz,MediaType mediaType):<br/><br/>指定转换器可以读取的媒体类型(如text/html、application/json等),MIME媒体类型在RFC2616中定义,详细可以参考:http://www.w3school.com.cn/media/media_mimeref.asp 。<br/><br/>② Boolean canWrite(Class<?> clazz,MediaType mediaType):<br/><br/>指定转换器可以将clazz类型的对象写道响应流中,响应流支持的媒体类型在mediaType中定义。<br/><br/>③ List<MediaType> getSupportedMediaTypes():<br/><br/>该转换器支持的媒体类型。<br/><br/>④ T read(Class<? extends T> clazz,HttpInputMessage inputMessage):<br/><br/>将请求信息流转换为T类型的对象。<br/><br/>⑤ void write(T t,MediaType contentType,HttpOutputMessage outputMessage):<br/><br/>将T类型的对象写到响应流中,同时指定响应的媒体类型为contentType。</p><p>————————————————<br/>版权声明:本文为CSDN博主「yongqi_wang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。<br/>原文链接:</p><div><a href="https://blog.csdn.net/yongqi_wang/article/details/87165241">https://blog.csdn.net/yongqi_wang/article/details/87165241</a></div><p><br/></p><p><br/></p><p>import java.io.IOException;<br/>import java.lang.reflect.Type;<br/>import java.nio.charset.Charset;<br/>import java.util.HashMap;<br/>import java.util.List;<br/><br/>import org.apache.poi.ss.formula.functions.T;<br/>import org.springframework.http.HttpInputMessage;<br/>import org.springframework.http.HttpOutputMessage;<br/>import org.springframework.http.MediaType;<br/>import org.springframework.http.converter.AbstractHttpMessageConverter;<br/>import org.springframework.http.converter.GenericHttpMessageConverter;<br/>import org.springframework.http.converter.HttpMessageConverter;<br/>import org.springframework.http.converter.HttpMessageNotReadableException;<br/>import org.springframework.http.converter.HttpMessageNotWritableException;<br/>import org.springframework.util.StreamUtils;<br/><br/>import com.alibaba.fastjson.JSON;<br/>import com.amway.pos.base.model.comm.WebRespBody;<br/><br/><br/>public class RestMessageConverter extends AbstractHttpMessageConverter<Object> implements GenericHttpMessageConverter<Object> {<br/><br/> private boolean needGzip = false;<br/> 自定义媒体类型<br/> public RestMessageConverter() {<br/> super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")), new MediaType("application", "json", Charset.forName("UTF-8")));<br/> }<br/> <br/><br/><br/> <br/><br/><br/> 只支持WebRespBody类<br/> @Override<br/> protected boolean supports(Class<?> clazz) {<br/> return T.class.isAssignableFrom(clazz);<br/> }<br/><br/><br/> 配置WiselyMessageConverter<br/> public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {<br/> RestMessageConverter converter = new RestMessageConverter();<br/> converters.add(converter);<br/> }<br/><br/> <br/><br/><br/><br/> 从request里获得构造WebRespBody实例的数据<br/> @Override<br/> protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)<br/> throws IOException, HttpMessageNotReadableException {<br/> TODO Auto-generated method stub<br/> <br/> String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));<br/> System.out.print("\n=========================="+temp+"\n=========================================");<br/> return null;<br/> }<br/><br/> 将WebRespBody实例转换成你想要的字符串格式<br/> @Override<br/> protected void writeInternal(Object t, HttpOutputMessage outputMessage)<br/> throws IOException, HttpMessageNotWritableException {<br/> String out = "hello:\n====================================" + t.toString();<br/> outputMessage.getBody().write(out.getBytes());<br/> <br/> }<br/><br/><br/><br/><br/> @Override<br/> public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {<br/> TODO Auto-generated method stub<br/> if("json".equals(mediaType.getSubtype())){<br/> return true;<br/> }<br/> return false;<br/> }<br/><br/><br/><br/><br/> @Override<br/> public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)<br/> throws IOException, HttpMessageNotReadableException {<br/> TODO Auto-generated method stub<br/> System.out.println("Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)");<br/> String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));<br/> System.out.print("\n=========================="+temp+"\n=========================================");<br/> Object obj = JSON.parseObject(inputMessage.getBody(), type);<br/> return obj;<br/> }<br/><br/><br/><br/><br/> @Override<br/> public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {<br/> TODO Auto-generated method stub<br/> return true;<br/> }<br/><br/><br/><br/><br/> @Override<br/> public void write(Object t, Type type, MediaType contentType, HttpOutputMessage outputMessage)<br/> throws IOException, HttpMessageNotWritableException {<br/> <br/> Object data = null;<br/> if (t instanceof HashMap) {<br/> data = HashMap) t).get("data");<br/> if (needGzip) {<br/> String str = JSON.toJSONString(data);<br/> data = GZIPUtils.toString(GZIPUtils.compress(str;<br/> HashMap) t).put("data", data);<br/> }<br/> }<br/> <br/> if (t instanceof WebRespBody) {<br/> data = ((WebRespBody) t).getData();<br/> if (needGzip) {<br/> String str = JSON.toJSONString(data);<br/> data = GZIPUtils.toString(GZIPUtils.compress(str;<br/> WebRespBody) t).setData(data);<br/> }<br/> }<br/> <br/> String json = JSON.toJSONString(t);<br/> outputMessage.getHeaders().add("Content-Type", "application/json;charset=UTF-8");<br/> outputMessage.getBody().write(json.getBytes("UTF-8";<br/> <br/> }<br/><br/><br/><br/><br/><br/><br/> public boolean isNeedGzip() {<br/> return needGzip;<br/> }<br/><br/><br/><br/><br/><br/><br/> public void setNeedGzip(boolean needGzip) {<br/> this.needGzip = needGzip;<br/> }<br/><br/><br/><br/><br/> <br/>}</p><p><br/></p><p><br/></p><p>@Configuration<br/>public class RestMessageConverterConfig {<br/><br/> <br/> @Value("${restapi.response.needgzip:false}")<br/> private boolean needgzip = false;<br/> <br/> 引入Fastjson解析json,不使用默认的jackson<br/> 必须在pom.xml引入fastjson的jar包,并且版必须大于1.2.10<br/> @Bean<br/> public HttpMessageConverters fastJsonHttpMessageConverters() {<br/><br/> <br/> RestMessageConverter wiselyMessageConverter = new RestMessageConverter();<br/> wiselyMessageConverter.setNeedGzip(needgzip);<br/><br/> return new HttpMessageConverters(wiselyMessageConverter, converter );<br/> }<br/></p><p><br/> </p>