2014-04-07 76 views
0

內涉及時間戳錯誤的請求我有一個Spring MVC 3控制器誰擁有的對象錯誤400:JSON對象

這個對象包含大量的屬性,大多是串/數字的@ModelAttribute參數。它有一個java.sql.Timestamp屬性。

我通過瀏覽器調用此方法,將屬性作爲單獨的查詢字符串鍵/值對傳遞。當我沒有通過一個鍵/值對的時間戳一切正常,它加載與我的所有屬性的對象。

但是,只要我嘗試爲Timestamp proeprty發送一個值,就會立即得到Error 400:Bad request。

我知道我必須以特定的格式發送數據字符串,但我只是使用JsonDeserializer,以便我可以使用我想要的格式解析字符串。但是當我在JsonDeserializer中設置一個斷點時,它永遠不會被擊中。春天似乎只是忽略它。我錯過了什麼?

一些代碼:

控制器:

@RequestMapping(headers = "Accept=application/json;charset=utf-8", value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody 
    public ReturnObject doSomething(@ModelAttribute MyObject obj, HttpServletRequest request) throws Exception {  
    //blah blah 
} 

爲MyObject:

public class MyObject { 
    private Integer someNumber; 
    private String someString; 
    @JsonDeserialize(using=ShortDateDeserializer.class) 
    private Timestamp someTimestamp; 
    // getter/setters like usual.... 
} 

ShortDateDeserializer:

public class ShortDateDeserializer extends JsonDeserializer<Timestamp> { 

    Logger logger = Logger.getLogger(ShortDateDeserializer.class); 

    @Override 
    public Timestamp deserialize(JsonParser parser, DeserializationContext ctx) throws IOException, JsonProcessingException { 

     try { 
      String rawDate = parser.getText(); 

      SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
      return new Timestamp(sdf.parse(rawDate).getTime()); 
     } catch (Exception e) { 
      logger.error("Failed to parse date: "+parser.getText()); 
      throw new IOException("Failed to parse date: "+parser.getText()); 
     } 
    } 
} 

當我打電話給我的服務只設置numbe r /字符串如下:

localhost/doSomething?someNumber=1&someString=xyz 

工作正常。

當我還試圖爲timstamp設定值:

localhost/doSomething?someNumber=1&someString=xyz&someTimestamp=09/15/2013 

我立即得到一個錯誤400:錯誤的請求。

爲了讓Spring在填充MyObject時使用自定義時間戳解析代碼,我錯過了什麼?

+0

在調試級別記錄您的請求並將其包含在您的問題中。日誌包'org.springframework.web' – Bart

+1

嘗試把'@RequestBody'而不是'@ModelAttribute' – luizcarlosfx

+0

@luizcarlosfx:是啊,實際上修復它!實際上,我甚至在這裏使用ModelAttribute是一個錯誤,我應該使用RequestBody,因爲它是一個包含大量數據的POST。感謝您的支持!雖然我仍然想知道爲什麼ModelAttribute無法使用Deserializer,因爲這仍然看起來像一些GET的不需要使用RequestBody的願望功能... – Trant

回答