【问题标题】:set content-length using MappingJacksonHttpMessageConverter使用 MappingJacksonHttpMessageConverter 设置内容长度
【发布时间】:2015-01-06 13:02:57
【问题描述】:

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

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

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

这个question was already asked,但是没有回答。

【问题讨论】:

    标签: java json spring-mvc


    【解决方案1】:

    使用我的 MappingJsonHttpMessageConverter 而不是 MappingJacksonHttpMessageConverter 我添加 ByteArrayOutputStream 和 Content-length 的 writeInternal

    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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2011-10-27
      • 2016-07-12
      • 1970-01-01
      • 2018-01-22
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多