一、HttpMessageConverter解决了什么问题
前提:
HTTP 请求和响应是基于文本 的,意味着浏览器和服务器通过交换原始文本进行通信。
java 中处理业务逻辑,都是以一个个有 业务意义的对象 为处理维度的

思考:
使用 controller中的方法返回 String 类型和域模型(或其他 Java 内建对象)。
如何将对象序列化/反序列化为原始文本?
文本到java对象的阻抗问题?

解决:
由 HttpMessageConverter 处理

Http请求和响应报文本质上都是一串字符串。

请求报文——》被封装成为一个ServletInputStream的输入流,供我们读取报文,把报文转成java对象
响应报文——》被封装成为一个ServletOutputStream的输出流,来输出响应报文。
1、HttpMessageConverter接口

public interface HttpMessageConverter<T> {

    boolean canRead(Class<?> clazz, MediaType mediaType);

    boolean canWrite(Class<?> clazz, MediaType mediaType);

    List<MediaType> getSupportedMediaTypes();

    T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException;

    void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException;

}

使用FastJsonHttpMessageConverter替换默认的

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();

        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(Long.class, LongCodec.instance);
        serializeConfig.put(long.class, LongCodec.instance);
        serializeConfig.put(BigDecimal.class, BigDecimalCodec.instance);
        serializeConfig.put(BigInteger.class, BigIntegerCodec.instance);
        serializeConfig.put(String.class, StringCodec.instance);
        List<MediaType> mediaTypes = new ArrayList<>(16);
        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        FastJsonConfig fjc = new FastJsonConfig();
        //1、序列化重点
        fjc.setSerializerFeatures(SerializerFeature.PrettyFormat,SerializerFeature.BrowserCompatible,
                SerializerFeature.WriteMapNullValue);
        fjc.setSerializeConfig(serializeConfig);
        fjc.setCharset(Charset.forName("UTF-8"));
        fastJsonConverter.setFastJsonConfig(fjc);
        fastJsonConverter.setDefaultCharset(Charset.forName("UTF-8"));
        fastJsonConverter.setSupportedMediaTypes(mediaTypes);
        converters.add(0,fastJsonConverter);
    }
上一篇 下一篇