我有以下控制器方法:
@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 ... }