Я использую аннотации Spring MVC и hibernate для проверки входящих объектов запроса, и все это было прекрасно и денди, пока мне не понадобится проверить входящую коллекцию.spring mvc validator @valid не работает для коллекций
@RequestMapping(value = "/guests", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Set<GuestResource>> postGuestsToAttendance(
@Valid @RequestBody Set<RequestToAddGuest> guestRequests) throws FieldValidationException,
RequestBodyResourceBadRequestException
Как я понял, он пытался выполнить проверку на самом Сета, а не на отдельных членов внутри него.
После небольшого исследования я не смог найти никаких «простых» решений, но вместо этого нашел немного на пользовательских валидаторах и вызвал их. Поскольку мне действительно не нужен специальный валидатор, просто способ вызвать проверку для каждого элемента в наборе, я попытался заставить все работать, но безрезультатно. Что я делаю не так?
Вот мой вызов код:
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;
}