在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

回到顶部