validationSpring中的对象列表

我有以下控制器方法:

@RequestMapping(value="/map/update", method=RequestMethod.POST, produces = "application/json; charset=utf-8") @ResponseBody public ResponseEntityWrapper updateMapTheme( HttpServletRequest request, @RequestBody @Valid List 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; } ... } 

问题是未触发validation,未validationCompanyTag列表,从不调用“StringUUIDValidation”validation器。

如果我删除了List并且只尝试发送一个CompanyTag,即代替:

 @RequestBody @Valid List categories, 

使用:

 @RequestBody @Valid CompanyTag category, 

它按预期工作,所以显然Spring不喜欢validation事物列表(尝试使用数组,但也没有用)。

任何人都知道缺少什么?

我找到了另一种方法。 基本问题是您希望将列表作为服务的输入有效负载,但javax.validation不会validation列表,只validationJavaBean。 诀窍是使用一个自定义列表类,它既作为List 作为JavaBean:

 @RequestBody @Valid List categories 

改成:

 @RequestBody @Valid ValidList categories 

您的列表子类看起来像这样:

 public class ValidList implements List { @Valid private List list; public ValidList() { this.list = new ArrayList(); } public ValidList(List list) { this.list = list; } // Bean-like methods, used by javax.validation but ignored by JSON parsing public List getList() { return list; } public void setList(List 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 ... } 

我建议将List类别包装到一些DTO bean中并validation它。 除了工作validation之外,您还将受益于更灵活的API。

 @RequestMapping(value="/map/update", method=RequestMethod.POST, produces = "application/json; charset=utf-8") @ResponseBody public ResponseEntityWrapper updateMapTheme( HttpServletRequest request, @RequestBody @Valid TagRequest tagRequest, HttpServletResponse response ) throws ResourceNotFoundException, AuthorizationException { ... } public static class TagRequest { @Valid List categories; // Gettes setters } 

我认为最优雅的解决方案是创建一个自定义的Validator for Collection和一个@ControllerAdvice,它在WebDataBinders中注册Validator,看看Springvalidation绑定到Controller方法中的集合的RequestBody参数

validation集合不起作用。

例如:如果多个元素未通过validation,该怎么办? 首次validation后停止? validation所有(如果是这样,对消息集合要做什么)?

如果在您的配置中Spring委托给像Hibernate Validator这样的Bean Validator提供程序,那么您应该查找在那里实现集合validation器的方法。

对于Hibernate, 这里讨论类似的问题