Spring-MVC的@Valid抛出了不存在的表单错误

时间:2011-09-01 05:53:30

标签: forms spring validation spring-mvc

我有一个奇怪的问题,我正在尝试通过Spring MVC Controller编辑现有的Company对象,该控件上有一些验证规则。验证将使用@Valid触发。

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@Valid Company company, BindingResult result, SessionStatus status) {
    if(result.hasErrors()) {
        return view("edit");
    } else {
        companyService.saveCompany(company);
        status.setComplete();

        return redirect("?isSaved=true");
    }
}

公司对象的各个验证在单元测试中传递。当在应用程序的其他部分中使用时,它们可以正常工作。但是,对于其中一种形式,Spring总是会抛出“字段不应为空”或“电话号码格式错误”等错误,但数据实际上是正确的。

这种情况最糟糕的是这段代码已经播放了一年多 - 这只是一个简单的“编辑你的公司信息”屏幕。它突然停止了工作。无论我在表单上提交什么内容,Spring都会抛出这些错误。

我检查并仔细检查了可能出错的一切。它正在加载正确的Company对象。它也发布了正确的值。作为一个完整性检查,我甚至在提交表单后显示确切的错误对象:

Field error in object 'company' on field 'phoneNumber': rejected value [451-324-3232]; codes [Pattern.company.phoneNumber,Pattern.phoneNumber,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber],[Ljavax.validation.constraints.Pattern$Flag;@2c99f9,(\()?(\d){3}(\))?(\s|-)(\d){3}(\s|-)(\d){4}]; default message [Must be of the form: ###-###-####]
Field error in object 'company' on field 'name': rejected value [somewhere]; codes [NotEmpty.company.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.name,name]; arguments []; default message [name]]; default message [Name may not be empty]
Field error in object 'company' on field 'address.address': rejected value [135431]; codes [NotEmpty.company.address.address,NotEmpty.address.address,NotEmpty.address,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.address.address,address.address]; arguments []; default message [address.address]]; default message [Address may not be empty]

正如您所看到的,这些值是正确的,但无论如何它都会抛出错误。

此外,公司对象有一个ID - 它不会丢失或类似的东西。

如果我删除@Valid,一切正常。所有的值都会改变,所以我知道它与@Valid直接相关。但是什么?

我知道您可能认为验证规则必定是错误的或者某些东西......但事实并非如此。怎么会有人弄乱@NotEmpty限制?

public class Company extends DomainObject {

    @NotEmpty(message = "{company.name.notEmpty}")
    private String name;

    @Valid
    private Address address = new Address();

    @Pattern(message = "{company.phoneNumber.valid}",
        regexp = "(\\()?(\\d){3}(\\))?(\\s|-)(\\d){3}(\\s|-)(\\d){4}")
    private String phoneNumber = "";
    private boolean isEnabled = true;
    private boolean homepageViewable = true;
    private int coursesCreated = 0;

    @Valid
    private Theme theme = new Theme();

我在这些领域投入的并不重要 - 我仍然得到错误。此外,在单独测试这些验证时,他们工作。实际上,当@Valid用于系统其他部分的Company对象时(如注册注册表单),它也可以工作。

所以唯一不起作用的部分是公司简介屏幕。

有没有理由为什么Spring-MVC会这样做?我完全不知所措。我甚至不知道我做了什么导致这个问题。当我进行更改时,它不像任何单元/集成测试失败。在我手动尝试这些屏幕之前,我从未收到过这个问题的警告 - 使用Spring / Java时常见的烦恼因为很多情况下单元/集成测试与使用真实的生产容器略有不同,所以无论如何都会出现问题。

请帮忙。

1 个答案:

答案 0 :(得分:0)

一个想法。当公司验证工作时,它是否总是在公司是更大的一部分的形式?例如,通过注册,该公司是注册的一部分。但是,当您尝试将公司保存在公司表单上时,它会失败......

您可以尝试将@ModelAttribute附加到公司arg吗?即。

@ModelAttribute @Valid Company company

有帮助吗?