2016-02-29 61 views
0

我正在研究一箇舊的Spring應用程序,其中包含許多需要生存的遺留代碼。現在我正在研究更現代的API使用方法,並且我偶然發現了一個問題。Spring MVC - 添加GsonHttpMessageConverter導致空@ResponseBody對象

我添加了GSON,用於轉換不同格式和前端的日期(見下文)。但是這在運行時會導致問題,@ResponseBody對象變爲空。

它在MockMVC中正常工作,它掛接了配置,但在運行時在Tomcat 8中,它有問題。由於我一直在搜索這個網頁很長一段時間,似乎它也可能是一個問題,因爲傑克遜也試圖解析JSON。

任何想法如何確保只有GSON用於JSON請求? (我的請求只包含簡單Pojo的日期,字符串和長對象),但可以有一些嵌套的對象。

一些代碼片斷:

WebConfig:

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 


    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new RestLoggingInterceptor()); 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new ExtendedGsonHttpMessageConverter()); 
    } 
} 

ExtendedGsonHttpMessageConverter

public class ExtendedGsonHttpMessageConverter extends GsonHttpMessageConverter 
{ 
    private static final String[] DATE_FORMATS = new String[] { 
      "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", 
      "yyyy-MM-dd'T'HH:mm:ss.SSSZ", 
      "yyyy-MM-dd'T'HH:mmZ", 
      "yyyy-MM-dd'T'HH:mm:ssZ", 
      "yyyy-MM-dd'T'HH:mm:ss-'07:00'" 
    }; 


    public ExtendedGsonHttpMessageConverter() 
    { 
     super(); 
     super.setGson(buildGson()); 
    } 
    protected static Gson buildGson() { 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer()); 
     return gsonBuilder.create(); 
    } 

    private static class DateDeserializer implements JsonDeserializer<Date> { 

     @Override 
     public Date deserialize(JsonElement jsonElement, Type typeOF, 
           JsonDeserializationContext context) throws JsonParseException { 
      for (String format : DATE_FORMATS) { 
       try { 
        return new SimpleDateFormat(format, Locale.GERMANY).parse(jsonElement.getAsString()); 
       } catch (ParseException e) { 
       } 
      } 
      throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString() 
        + "\". Supported formats: " + Arrays.toString(DATE_FORMATS)); 
     } 
    } 
} 
+1

使用此配置,只有1個'HttpMessageConverter',因爲當您使用'configureMessageConverters'時,這意味着您想使用手動配置的轉換器。基本上傑克遜不會參加比賽。 –

+0

我剛剛發現我的問題可能是由我的日誌記錄攔截器造成的,它正在輸出請求正文,這使得Controller無法訪問正文,感謝那些信息,儘管 –

+0

正確,因爲您只能讀取一次請求,您將不得不復制輸入流。另外Spring已經有一個Filterto記錄請求,它已經爲你做了這個。檢查'AbstractRequestLoggingFIlter'及其子類。 –

回答

0

的問題是使用其記錄所述請求的攔截。 記錄請求會導致requestBody爲空,所以現在我將使用Springs AbstractRequestLoggingFilter作爲註釋中的內容。