一尘不染

在Spring中验证对象列表

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不喜欢验证事物列表(而是尝试使用数组,但同样没有效果)。

有人知道缺少什么吗?


阅读 519

收藏
2020-04-14

共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 ...
}
2020-04-14