2013-05-31 3 views
0

Я использую аннотации 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; 

} 

ответ

0

Хорошо, я нашел этот вопрос ... Я получил так оказавшийся в коде проверки, у меня был не обратил внимания на мои имена переменных ... Я никогда не менял приглашение на валидацию для вызова на отдельном гостевом запросе, а не на весь список с именем guestRequest * s *

Смежные вопросы