2015-07-28 43 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) { 

这样,输入验证失败将被执行的控制方法,任何事情之前抛出异常。