在 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 不喜欢验证事物列表(尝试使用数组,但也不起作用)。

有人知道缺少什么吗?

原文由 TheZuck 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 649
1 个回答

我找到了另一种有效的方法。基本问题是您希望有一个列表作为您的服务的输入负载,但 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 ...
}

原文由 Paul Strack 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题