2015-07-28 59 views
1

我是一個丟失位,我不得不承認。我寫了一個彈簧引導(1.3M2)應用程序,其接收它需要在數據庫中存儲一個JSON對象:Spring引導/ Jackson反序列化JSON的錯誤類型

@RequestMapping(value = "/fav", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    public ResponseEntity<String> setFavorite(@RequestBody List<Favorite> favorites) { 
... 

內部此方法傳遞JSON,其通過在數據庫中存儲線它線的另一種方法:

jdbcTemplate.batchUpdate(INSERT_FAVORITE, new BatchPreparedStatementSetter() { 
       @Override 
       public void setValues(PreparedStatement ps, int i) throws SQLException { 
        Favorit fav = favorites.get(i); 
        ps.setString(... 
       } 

       @Override 
       public int getBatchSize() { 
        int size = favorites.size(); 
        return size; 
       } 

當我POST一個JSON到與我的收藏對象的結構不匹配的控制器時,我只能在我的數據庫中看到空值。很顯然,傑克遜盡我所能將我的JSON轉換爲Java對象,但失敗並將其找不到值的對象的所有值設置爲null。 然後將這種空對象列表寫入數據庫。

我使用curl POST值

curl -vX POST https://localhost/fav -d @incorrectype.json 

這不可能是錯誤的來源,因爲它有一個favorite.json工作。如果我使用不匹配的JSON,如何檢測我的控制器/ Jackson?

+1

你使用Jackson的'@ Json *'註釋還是隻使用POJO:s? – zrvan

+1

作爲旁註,'produce = MediaType.APPLICATION_JSON_VALUE'並返回'ResponseEntity '有點奇怪的組合,你的意思是'消費'嗎? – zrvan

回答

1

一種解決方案是使用註釋從javax.validation,並且代替在控制器簽名接受List,使用定製的包裝沿此的(getter/setter方法中省略)的線:

public class FavoriteList { 
    @Valid 
    @NotNull 
    @Size(min = 1) 
    private List<Favorite> favorites; 
} 

然後爲Favorite類根據需要添加驗證,例如,摹:

public class Favorite { 
    @NotNull 
    private String id; 
} 

這些變化的地方,修改控制器方法簽名沿着這些線路:

public ResponseEntity<String> setFavorite(@Valid @RequestBody FavoriteList favoritesList) { 

這樣,輸入驗證失敗將被執行的控制方法,任何事情之前拋出異常。