如何在不将List包装在其他类中的情况下验证spring控制器中List中的每个对象?

Sus*_*mar 3 java spring hibernate

我有一个弹簧控制器:

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

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

public class ValidatableObjectsCollectionWrapper {
    @Valid
    List<BulkDTO> bulkDTOs;
}
Run Code Online (Sandbox Code Playgroud)

因为它将更改输入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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 5

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

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());
    }
}
Run Code Online (Sandbox Code Playgroud)