繁体   English   中英

使用MappingJacksonHttpMessageConverter设置内容长度

[英]set content-length using MappingJacksonHttpMessageConverter

我正在使用Spring MVC使用MappingJacksonHttpMessageConverter设置返回JSON对象的REST控制器。

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

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

已经问过这个问题 ,但是没有回答。

使用我的MappingJsonHttpMessageConverter而不是MappingJacksonHttpMessageConverter的writeInternal方法,在其中添加ByteArrayOutputStream和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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM