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 ().