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, 这里讨论类似的问题