我有一个 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/