我有一个奇怪的问题,我正在尝试通过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时常见的烦恼因为很多情况下单元/集成测试与使用真实的生产容器略有不同,所以无论如何都会出现问题。
请帮忙。
答案 0 :(得分:0)
您可以尝试将@ModelAttribute附加到公司arg吗?即。
@ModelAttribute @Valid Company company
有帮助吗?