2014-06-11 1 views
13

Ich habe einige Code:Wie wird die Inhaltslänge in Spring MVC REST für JSON festgelegt?

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

Wie konnte ich so konfigurieren, Spring MVC (oder MappingJackson2HttpMessageConverter.class) rechts Header Content-Length standardmäßig eingestellt? Weil jetzt mein Antwortkopf content-length gleich -1 ist.

+2

Sie können dies überprüfen http://forketyfork.blogspot.com/2013/06/how-to-return-file-stream-or-classpath.html – shazin

+0

@shazin Danke. Es ist keine schlechte Lösung. Es funktioniert!) – ruslanys

Antwort

10

Sie können ShallowEtagHeaderFilter der Filterkette hinzufügen. Das folgende Snippet funktioniert für mich.

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

} 

Die Antwort Körper sieht aus wie die folgende Liste:

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 
4

Der folgende Filter in Kettensätze Content-Length:

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

} 

Die Idee, dass alle Inhalte in ContentCachingResponseWrapper zwischengespeichert wird und schließlich wird content-length gesetzt, wenn Sie copyBodyToResponse() aufrufen.

Verwandte Themen