首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring MVC -@在REST服务中的bean列表上有效

Spring MVC -@在REST服务中的bean列表上有效
EN

Stack Overflow用户
提问于 2013-06-20 15:32:03
回答 7查看 37.4K关注 0票数 40

在Spring MVC REST服务(json)中,我有一个类似如下的控制器方法:

代码语言:javascript
复制
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

其中MyBean类包含bean验证注释。

在这种情况下,验证似乎不会发生,尽管它可以很好地用于其他控制器。

我不想将列表封装在会更改json输入的dto this中。

为什么没有对bean列表进行验证?有什么替代方案吗?

EN

回答 7

Stack Overflow用户

发布于 2016-02-25 05:40:55

尝试直接验证。如下所示:

代码语言:javascript
复制
@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())
        ...
票数 4
EN

Stack Overflow用户

发布于 2016-06-27 15:26:19

有一种优雅的方法可以将请求包装在既充当List又充当JavaBean的自定义java.util.List中。see here

票数 4
EN

Stack Overflow用户

发布于 2019-05-09 18:58:36

使用com.google.common.collect.ForwardingList

代码语言:javascript
复制
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;
  }
}

所以不需要包装器

您可以使用

代码语言:javascript
复制
@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody ValidList<MyBean> request, BindingResult bindingResult) {

通过使用包装器,您的JSON需要更改为

代码语言:javascript
复制
{
  "list": []
}

通过这种实现,您可以使用原始的JSON

代码语言:javascript
复制
[]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17207766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档