使用MappingJacksonHttpMessageConverter设置内容长度 [英] set content-length using MappingJacksonHttpMessageConverter

查看:182
本文介绍了使用MappingJacksonHttpMessageConverter设置内容长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Spring MVC通过MappingJacksonHttpMessageConverter设置一个返回JSON对象的REST控制器.

I'm using Spring MVC to setup a REST controller that returns a JSON object, using MappingJacksonHttpMessageConverter.

如何告诉MappingJacksonHttpMessageConverter还要在响应标头上设置"Content-Length"属性? (默认情况下,"Content-Length"设置为-1,因为MappingJacksonHttpMessageConverter不会计算JSON对象的长度.)

How do I tell the MappingJacksonHttpMessageConverter to also set the "Content-Length" attribute on the response header ? (By default the "Content-Length" is set to -1, as the MappingJacksonHttpMessageConverter does not calculate the JSON object length).

我不在乎内容长度的计算是否会影响控制器的响应时间(因为MappingJacksonHttpMessageConverter将需要缓冲编组的JSON对象才能计算其长度).

I do not care if the content length calculation will affect the controller's response time (as the MappingJacksonHttpMessageConverter will need to buffer the marshalled JSON object in order to calculate its length).

问题已被提出,但未得到回答

推荐答案

使用我的MappingJsonHttpMessageConverter代替MappingJacksonHttpMessageConverter的writeInternal方法,在其中添加ByteArrayOutputStream和Content-length

use my MappingJsonHttpMessageConverter instead of MappingJacksonHttpMessageConverter the writeInternal where I add ByteArrayOutputStream and Content-length

package org.zcoreframework.web.http.converter;


import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;


public class MappingJsonHttpMessageConverter extends MappingJackson2HttpMessageConverter {

    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {

        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
        // The following has been deprecated as late as Jackson 2.2 (April 2013);
        // preserved for the time being, for Jackson 2.0/2.1 compatibility.
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        @SuppressWarnings("deprecation")
        JsonGenerator jsonGenerator =
                this.getObjectMapper().getJsonFactory().createJsonGenerator(byteArrayOutputStream, encoding);

        // A workaround for JsonGenerators not applying serialization features
        // https://github.com/FasterXML/jackson-databind/issues/12
        if (this.getObjectMapper().isEnabled(SerializationFeature.INDENT_OUTPUT)) {
            jsonGenerator.useDefaultPrettyPrinter();
        }

        try {
            this.getObjectMapper().writeValue(jsonGenerator, object);

            //--> set content length
            outputMessage.getHeaders().setContentLength(byteArrayOutputStream.size());      
            byteArrayOutputStream.writeTo(outputMessage.getBody());
            byteArrayOutputStream.flush();          
        }
        catch (JsonProcessingException ex) {
            throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
        }
    }
}

这篇关于使用MappingJacksonHttpMessageConverter设置内容长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆