当前位置: 首页 > 知识库问答 >
问题:

如何在spring控制器参数中验证列表中的每个对象,而不在其他类中包装列表?

司英飙
2023-03-14

我有一个Spring控制器:

@RequestMapping(value = "bulk", method = RequestMethod.POST)
@ResponseBody
public APIResponse createBulkEnquiries(@Valid @RequestBody List<BulkDTO> bulkDTOs) {
    // some code 
}

它不验证任何一个BulkDTO,因为@有效不直接在集合元素上工作(尽管BulkDTO是可验证的)。我也不能在其他类中包装列表(这是有效的),比如

public class ValidatableObjectsCollectionWrapper {
    @Valid
    List<BulkDTO> bulkDTOs;
}

因为它会改变输入json格式。所以我需要一些其他的方法。

我还试着为收藏制作一个自定义验证器

public class CollectionValidator implements Validator {

private final SpringValidatorAdapter validator;

public CollectionValidator(SpringValidatorAdapter validator) {
    super();
    this.validator = validator;
}

@Override
public boolean supports(Class<?> clazz) {
    return Collection.class.equals(clazz);
}

@Override
public void validate(Object target, Errors errors) {

    Collection<Object> objectCollection = (Collection<Object>) target;

    for (Object object : objectCollection) {
        validator.validate(object, errors);
    }
}
}

但是不知道如何在控制器参数上调用或绑定它。

共有2个答案

叶德本
2023-03-14

实际上,这可以通过使用Spring验证和JSR303来实现。

*公开一个方法验证后置处理器bean。

用@Validated(org.springframework.validation.annotation.Validated)注释控制器类

在MyEntity字段/方法上使用JSR303验证注释。

用@Valid注释RequestBody参数(您在示例中已经这样做了)。

添加一个@ExceptionHandler方法来处理metodArgumentNotValidExctive。这可以在控制器中完成,也可以在@控件建议类中完成。*

屠华辉
2023-03-14

不确定这是唯一的还是最好的解决方案,但您可以使用包装器对象,而无需更改JSON,使用@JsonValue@JsonCreator注释。下面是一个完整的例子:

public class BulkDTOWrapper {

    private List<BulkDTO> bulks;

    @JsonCreator
    public BulkDTOWrapper(List<BulkDTO> bulks) {
        this.bulks = bulks;
    }

    public BulkDTOWrapper() {
    }

    @JsonValue
    public List<BulkDTO> getBulks() {
        return bulks;
    }

    public void setBulks(List<BulkDTO> bulks) {
        this.bulks = bulks;
    }

    public static void main(String[] args) throws IOException {
        BulkDTO b1 = new BulkDTO("hello");
        BulkDTO b2 = new BulkDTO("world");

        BulkDTOWrapper wrapper = new BulkDTOWrapper();
        wrapper.setBulks(Arrays.asList(b1, b2));

        ObjectMapper om = new ObjectMapper();
        String json = om.writeValueAsString(wrapper);
        System.out.println("json = " + json);

        BulkDTOWrapper wrapper2 = om.readValue(json, BulkDTOWrapper.class);
        System.out.println(wrapper2.getBulks().size());
    }
}
 类似资料:
  • 问题内容: 我有以下控制器方法: CompanyTag是这样定义的: 问题是没有触发验证,没有验证CompanyTag列表,从不调用“ StringUUIDValidation”验证器。 如果我删除列表,仅尝试发送单个CompanyTag,即代替: 利用: 它可以按预期工作,因此显然Spring不喜欢验证事物列表(而是尝试使用数组,但同样没有效果)。 有人知道缺少什么吗? 问题答案: 我发现了另一

  • 使用: 它按照预期工作,所以Spring显然不喜欢验证事物列表(尝试使用数组,但也不起作用)。 有人知道缺了什么吗?

  • 我正在尝试使用这些数据 https://api.nasa.gov/neo/rest/v1/neo/browse?api_key=demo_key 我成功地检索到了数据的“links”和“page”部分,但near_earth_objects数组为NULL。 我尝试了这篇文章中的建议: 使用Spring RestTemplate获取JSON对象列表 顶部答案给出错误: 下面是我的POJO的样子: 我

  • 我有一个类来代表一个玩家的手牌。但是,我(在另一个类中)有一个数组列表,我想在其中表示一堆玩家手。问题是我不知道如何在多手牌的数组列表中将一张牌添加到手牌中。我有一个代表卡牌和一副牌的类,效果很好。我只是试图了解如何将对象添加到数组列表中的对象。谢谢!

  • 我正在尝试为我的列表模式中的每个对象创建一个包含该对象数据的表单。 所以我的控制器中有: 在我的ThymeLeaf模板中: 控制器: ThymeLeaf模板: 这种情况不会引发任何异常,但为空

  • 我目前正在用Spring Boot和Thymeleaf做一个项目,以了解两者的基本知识。现在我被一个问题卡住了,这个问题看起来很容易,但我无法掌握它的窍门。我只是有一个名为“电影”的现有对象,我想编辑它并将覆盖的版本保存到数据库中。现在我所要做的就是用电影的数据填充一个表单。这很好,但问题是,因为一部电影可以有多个演员,所以我在每个电影对象中保存了一个演员的数组列表,其中有一个名为name的属性。