| — |
服务器技术:java:springmvc之httpmessageconverter类 [2020/03/03 15:50] (当前版本) admin 创建 |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | <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> | ||