在Spring MVC REST服务(json)中,我有一个类似如下的控制器方法:
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {
其中MyBean类包含bean验证注释。
在这种情况下,验证似乎不会发生,尽管它可以很好地用于其他控制器。
我不想将列表封装在会更改json输入的dto this中。
为什么没有对bean列表进行验证?有什么替代方案吗?
发布于 2016-02-25 05:40:55
尝试直接验证。如下所示:
@Autowired
Validator validator;
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public Object myMethod(@RequestBody List<Object> request, BindingResult bindingResult) {
for (int i = 0; i < request.size(); i++) {
Object o = request.get(i);
BeanPropertyBindingResult errors = new BeanPropertyBindingResult(o, String.format("o[%d]", i));
validator.validate(o, errors);
if (errors.hasErrors())
bindingResult.addAllErrors(errors);
}
if (bindingResult.hasErrors())
...
发布于 2016-06-27 15:26:19
有一种优雅的方法可以将请求包装在既充当List
又充当JavaBean
的自定义java.util.List
中。see here
发布于 2019-05-09 18:58:36
使用com.google.common.collect.ForwardingList
public class ValidList<T> extends ForwardingList<T> {
private List<@Valid T> list;
public ValidList() {
this(new ArrayList<>());
}
public ValidList(List<@Valid T> list) {
this.list = list;
}
@Override
protected List<T> delegate() {
return list;
}
/** Exposed for the {@link javax.validation.Validator} to access the list path */
public List<T> getList() {
return list;
}
}
所以不需要包装器
您可以使用
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody ValidList<MyBean> request, BindingResult bindingResult) {
通过使用包装器,您的JSON需要更改为
{
"list": []
}
通过这种实现,您可以使用原始的JSON
[]
https://stackoverflow.com/questions/17207766
复制相似问题