我一直在使用 Spring MVC 和 hibernate 注释来验证传入的请求对象,在我需要验证传入的集合之前,这一切都很好。
@RequestMapping(value = "/guests", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Set<GuestResource>> postGuestsToAttendance(
@Valid @RequestBody Set<RequestToAddGuest> guestRequests) throws FieldValidationException,
RequestBodyResourceBadRequestException
正如我所想的那样,它试图对 Set 本身而不是其中的单个成员执行验证。
经过一番研究,我找不到任何“简单”的解决方案,而是在自定义验证器上找到了一些并调用它们。由于我真的不需要自定义验证器,只是一种为集合中的每个项目调用验证的方法,我试图让所有这些都正常工作,但无济于事。我究竟做错了什么?
这是我的调用代码:
for (RequestToAddGuest guestRequest : guestRequests) {
// Perform validation
BindingResult bindingResults = new DirectFieldBindingResult(guestRequest, RequestToAddGuest.class.getName());
validator.validate(guestRequests, bindingResults);
checkForErrors(bindingResults);
}
这是 checkForErrors 代码。当我仅在一个单独的对象上使用 @Valid 时,它工作得很好。
protected void checkForErrors(BindingResult results) throws FieldValidationException {
if (results.hasErrors()) {
FieldValidationException exception = new FieldValidationException();
exception.setFieldErrors(results.getFieldErrors());
throw exception;
}
}
作为参考,这里是带有验证注释的 RequestToAddGuest 类:
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.SafeHtml;
public class RequestToAddGuest {
@NotEmpty
@SafeHtml
public String firstName;
@SafeHtml
@NotEmpty
public String lastName;
@SafeHtml
public String emailAddress;
@SafeHtml
public String streetLine1;
@SafeHtml
public String streetLine2;
@SafeHtml
public String streetLine3;
@SafeHtml
public String city;
@SafeHtml
public String stateCode;
@SafeHtml
public String zip;
@SafeHtml
public String countryCode;
@SafeHtml
public String phoneArea;
@SafeHtml
public String phoneNumber;
@SafeHtml
public String phoneExtension;
}