HttpMessageConverter是Spring的一个重要接口,它负责将请求信息转换为一个对象,将对象输出为响应信息。

DispatcherServlet默认已经安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类,HttpMessageConverter即由RequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。

HttpMessageConverter接口定义了以下几个方法。

① Boolean canRead(Class<?> clazz,MediaType mediaType):

指定转换器可以读取的媒体类型(如text/html、application/json等),MIME媒体类型在RFC2616中定义,详细可以参考:http://www.w3school.com.cn/media/media_mimeref.asp 。

② Boolean canWrite(Class<?> clazz,MediaType mediaType):

指定转换器可以将clazz类型的对象写道响应流中,响应流支持的媒体类型在mediaType中定义。

③ List<MediaType> getSupportedMediaTypes():

该转换器支持的媒体类型。

④ T read(Class<? extends T> clazz,HttpInputMessage inputMessage):

将请求信息流转换为T类型的对象。

⑤ void write(T t,MediaType contentType,HttpOutputMessage outputMessage):

将T类型的对象写到响应流中,同时指定响应的媒体类型为contentType。

————————————————
版权声明:本文为CSDN博主「yongqi_wang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:

https://blog.csdn.net/yongqi_wang/article/details/87165241



import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;

import org.apache.poi.ss.formula.functions.T;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;

import com.alibaba.fastjson.JSON;
import com.amway.pos.base.model.comm.WebRespBody;


public class RestMessageConverter extends AbstractHttpMessageConverter<Object> implements GenericHttpMessageConverter<Object> {

    private boolean needGzip = false;
    // 自定义媒体类型
    public RestMessageConverter() {
        super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")),  new MediaType("application", "json", Charset.forName("UTF-8")));
    }
    


    


    // 只支持WebRespBody类
    @Override
    protected boolean supports(Class<?> clazz) {
        return T.class.isAssignableFrom(clazz);
    }


    // 配置WiselyMessageConverter
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        RestMessageConverter converter = new RestMessageConverter();
        converters.add(converter);
    }

    



    // 从request里获得构造WebRespBody实例的数据
    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        // TODO Auto-generated method stub
        
        String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
        System.out.print("\n=========================="+temp+"\n=========================================");
        return null;
    }

    // 将WebRespBody实例转换成你想要的字符串格式
    @Override
    protected void writeInternal(Object t, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        String out = "hello:\n====================================" + t.toString();
        outputMessage.getBody().write(out.getBytes());
        
    }




    @Override
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
        // TODO Auto-generated method stub
        if("json".equals(mediaType.getSubtype())){
            return true;
        }
        return false;
    }




    @Override
    public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        // TODO Auto-generated method stub
        System.out.println("Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)");
        //String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
        //System.out.print("\n=========================="+temp+"\n=========================================");
        Object obj = JSON.parseObject(inputMessage.getBody(), type);
        return obj;
    }




    @Override
    public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
        // TODO Auto-generated method stub
        return true;
    }




    @Override
    public void write(Object t, Type type, MediaType contentType, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        
        Object data = null;
        if (t instanceof HashMap) {
             data = ((HashMap) t).get("data");
             if (needGzip) {
                 String str = JSON.toJSONString(data);
                 data = GZIPUtils.toString(GZIPUtils.compress(str));
                 ((HashMap) t).put("data", data);
            }
        }
        
        if (t instanceof WebRespBody) {
             data = ((WebRespBody) t).getData();
             if (needGzip) {
                 String str = JSON.toJSONString(data);
                 data = GZIPUtils.toString(GZIPUtils.compress(str));
                 ((WebRespBody) t).setData(data);
            }
        }
        
        String json = JSON.toJSONString(t);
        outputMessage.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
        outputMessage.getBody().write(json.getBytes("UTF-8"));
        
    }






    public boolean isNeedGzip() {
        return needGzip;
    }






    public void setNeedGzip(boolean needGzip) {
        this.needGzip = needGzip;
    }




    
}



@Configuration
public class RestMessageConverterConfig {

    
    @Value("${restapi.response.needgzip:false}")
    private boolean needgzip = false;
    
    // 引入Fastjson解析json,不使用默认的jackson
    // 必须在pom.xml引入fastjson的jar包,并且版必须大于1.2.10
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {

        
        RestMessageConverter wiselyMessageConverter = new RestMessageConverter();
        wiselyMessageConverter.setNeedGzip(needgzip);

        return new HttpMessageConverters(wiselyMessageConverter, converter );
    }