0

我一直在使用 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;

}
4

1 回答 1

0

好吧,我发现了问题......我已经陷入验证代码中,我忽略了跟踪我的变量名......我从未将验证调用更改为在单个 guestRequest 上调用,而不是在名为 guestRequest* s *的整个列表

于 2013-06-03T13:51:04.153 回答