我有一个弹簧控制器:
@RequestMapping(value = "bulk", method = RequestMethod.POST) @ResponseBody public APIResponse createBulkEnquiries(@Valid @RequestBody ListbulkDTOs) { // some code }
它不会验证任何bulkDTO,因为@valid不能直接在Collection元素上运行(尽管BulkDTO是可验证的)。我也不能将List包装在其他一些类中(有效)
public class ValidatableObjectsCollectionWrapper { @Valid ListbulkDTOs; }
因为它将更改输入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
但是不知道如何在控制器参数上调用或绑定它。
不知道这是唯一的还是最好的解决方案,但是您可以使用包装对象,而无需使用@JsonValue
和@JsonCreator
注释更改JSON 。这是一个完整的示例:
public class BulkDTOWrapper { private Listbulks; @JsonCreator public BulkDTOWrapper(List bulks) { this.bulks = bulks; } public BulkDTOWrapper() { } @JsonValue public List getBulks() { return bulks; } public void setBulks(List 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()); } }