在Spring中验证对象列表
我有以下控制器方法:
@RequestMapping(value="/map/update", method=RequestMethod.POST, produces = "application/json; charset=utf-8")@ResponseBody
public ResponseEntityWrapper updateMapTheme(
HttpServletRequest request,
@RequestBody @Valid List<CompanyTag> categories,
HttpServletResponse response
) throws ResourceNotFoundException, AuthorizationException {
...
}
CompanyTag是这样定义的:
public class CompanyTag { @StringUUIDValidation String key;
String value;
String color;
String icon;
Icon iconObj;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
...
}
问题是没有触发验证,没有验证CompanyTag列表,从不调用“ StringUUIDValidation”验证器。
如果我删除列表,仅尝试发送单个CompanyTag,即代替:
@RequestBody @Valid List<CompanyTag> categories,
利用:
@RequestBody @Valid CompanyTag category,
它可以按预期工作,因此显然Spring不喜欢验证事物列表(而是尝试使用数组,但同样没有效果)。
有人知道缺少什么吗?
回答:
我发现了另一种可行的方法。基本问题是你希望将列表作为服务的输入有效负载,但是javax.validation不会仅通过JavaBean来验证列表。诀窍是使用既可以用作List 又可以用作JavaBean 的自定义列表类:
@RequestBody @Valid List<CompanyTag> categories
改成:
@RequestBody @Valid ValidList<CompanyTag> categories
你的列表子类如下所示:
public class ValidList<E> implements List<E> { @Valid
private List<E> list;
public ValidList() {
this.list = new ArrayList<E>();
}
public ValidList(List<E> list) {
this.list = list;
}
// Bean-like methods, used by javax.validation but ignored by JSON parsing
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
// List-like methods, used by JSON parsing but ignored by javax.validation
@Override
public int size() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
// Other list methods ...
}
以上是 在Spring中验证对象列表 的全部内容, 来源链接: utcz.com/qa/416702.html