Как установить длину содержимого в Spring MVC REST для JSON?

У меня есть код:

@RequestMapping(value = "/products/get", method = RequestMethod.GET)
public @ResponseBody List<Product> getProducts(@RequestParam(required = true, value = "category_id") Long categoryId) {
    // some code here
    return new ArrayList<>();
}

Как я могу настроить Spring MVC (или MappingJackson2HttpMessageConverter.class) для установки правильного заголовка Content-Length по умолчанию? Потому что теперь мой заголовок ответа content-length равен -1.


person ruslanys    schedule 11.06.2014    source источник
comment
Вы можете проверить этот forketyfork. blogspot.com/2013/06/   -  person shazin    schedule 11.06.2014
comment
@shazin Спасибо. Это неплохое решение. Это работает!)   -  person ruslanys    schedule 11.06.2014


Ответы (2)


Вы можете добавить ShallowEtagHeaderFilter в цепочку фильтров. Следующий фрагмент работает для меня.

import java.util.Arrays;

import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterBean = new FilterRegistrationBean();
        filterBean.setFilter(new ShallowEtagHeaderFilter());
        filterBean.setUrlPatterns(Arrays.asList("*"));
        return filterBean;
    }

}

Тело ответа будет выглядеть следующим образом:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application:sxp:8090
ETag: "05e7d49208ba5db71c04d5c926f91f382"
Content-Type: application/json;charset=UTF-8
Content-Length: 232
Date: Wed, 16 Dec 2015 06:53:09 GMT
person Woody Sun    schedule 16.12.2015
comment
org.springframework.boot.context.embedded.FilterRegistrationBean устарел с версии 1.4 в пользу org.springframework.boot.web.servlet.FilterRegistrationBean - person Rafael Membrives; 12.07.2021

Следующий фильтр в цепочке устанавливает длину содержимого:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.util.ContentCachingResponseWrapper;

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,     FilterChain chain) throws IOException, ServletException {

        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, responseWrapper);

        responseWrapper.copyBodyToResponse();

    }

    @Override
    public void destroy() {
    }

}

Основная идея заключается в том, что весь контент кэшируется в ContentCachingResponseWrapper и, наконец, длина контента устанавливается при вызове copyBodyToResponse().

person Dmitry Buzoverya    schedule 07.09.2016