Spring boot / Jackson反序列化错误类型的JSON

时间:2015-07-28 11:26:38

标签: json spring jackson

我不得不承认,我有点迷失了。我写了一个Spring Boot(1.3M2)应用程序,它接收一个需要存储在数据库中的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;
                }

当我将JSON发布到控制器时,它与我的收藏夹对象的结构不匹配时,我只在数据库中看到空值。显然,杰克逊尽力将我的JSON转换为Java对象,但失败并将其找不到的对象的所有值设置为null。 然后将这种空对象列表写入数据库。

我使用curl来发布值

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

这可能是错误的来源,因为它适用于favorite.json。如果我使用不匹配的JSON,我怎样才能让我的控制器/ Jackson检测到?

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用来自javax.validation的注释,而不是在控制器签名中接受List,而是沿着这一行使用自定义包装器(省略getter / setters):

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

然后为Favorite类根据需要添加验证,例如: G:

public class Favorite {
  @NotNull
  private String id;
}

如果有这些更改,请按以下方式修改控制器方法签名:

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

这样,输入失败验证将在执行控制器方法之前抛出异常。