tutorial responsebody requestmapping mvc example ejemplo java json spring spring-mvc content-length

java - responsebody - spring rest json



¿Cómo establecer la longitud del contenido en Spring MVC REST para JSON? (2)

Puede agregar ShallowEtagHeaderFilter para filtrar la cadena. El siguiente fragmento me funciona.

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

El cuerpo de respuesta tendrá el siguiente aspecto:

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

Tengo un código:

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

¿Cómo podría configurar Spring MVC (o MappingJackson2HttpMessageConverter.class) para establecer el encabezado derecho Content-Length de manera predeterminada? Porque ahora mi content-length encabezado de respuesta content-length igual a -1.


El siguiente filtro en cadena establece contenido-longitud:

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() { } }

La idea principal de que todo el contenido se almacena en caché en ContentCachingResponseWrapper y, finalmente, content-length se establece cuando se llama a copyBodyToResponse ().