java - 如何在不将 List 包装在其他类中的情况下验证 spring Controller 参数中 List 中的每个对象?

标签 java spring hibernate

我有一个 Spring Controller :

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

它不会验证任何 bulkDTO,因为 @valid 不能直接作用于 Collection 的元素(尽管 BulkDTO 是可验证的)。 我也不能将 List 包装在其他一些类(有效)中,比如

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

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

我还尝试为集合制作自定义 validator

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);
    }
}
}

但不知道如何在 Controller 参数上调用或绑定(bind)它。

最佳答案

不确定它是唯一的还是最好的解决方案,但是您可以使用包装器对象,而不必更改 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());
    }
}

关于java - 如何在不将 List 包装在其他类中的情况下验证 spring Controller 参数中 List 中的每个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577987/

相关文章:

java - 我的 Spring Boot 中的事务出现问题 - 我遇到异常,但事务正在提交

java - 在名为 Digit 的类中,编写一个名为 lastDigit 的方法,该方法返回整数的最后一位数字

java - 在 spring 应用程序中将 Controller 注入(inject)服务层是一种好习惯吗?

java - Tomcat 和 Spring MVC 中的缓存

java - 使用 Hibernate 从两个不同的 Web 应用程序 (GXT) 连接同一个数据库

java - 在 hibernate 状态下删除多个关系

java - 如何将一对多结果映射到使用非主键连接的 Hibernate 实体?

java - Spring 注入(inject) - 实例

Java Socket.IO 缺少依赖项 NoClassDefFoundError

Spring Webflux带注释的rest Controller 不支持ServerHttpRequest作为方法参数: java. lang.NoSuchMethodException