@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检测到?
答案 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) {
这样,输入失败验证将在执行控制器方法之前抛出异常。