我有一個奇怪的問題,我試圖通過一個Spring MVC控制器編輯一個現有的公司對象,它有一些驗證規則。驗證使用@Valid觸發。Spring-MVC的@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都會拋出這些錯誤。
我檢查並仔細檢查了所有可能出錯的東西。它正在加載正確的公司對象。它也發佈了正確的值。作爲一個全面的檢查,我甚至顯示確切的錯誤對象我提交表單後:
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用於系統其他部分的公司對象(如註冊註冊表單)時,它也可以工作。
所以它不起作用的唯一部分是公司簡介屏幕。
Spring-MVC會這樣做嗎?我完全不知所措。我甚至不知道我做了什麼導致這個問題。這不像任何單元/集成測試在我進行更改時失敗。在我手動嘗試這些屏幕之前,我從來沒有收到過這個問題 - 這是使用Spring/Java時常見的煩惱,因爲在許多情況下,單元/集成測試與使用真實的生產容器略有不同,所以問題無論如何都會滑落。
請幫忙。
這仍然不起作用。我處於全面虧損狀態。我已經嘗試了一切。我約99歲。5%認爲這與Spring運行時或tomcat容器現在有關。 – egervari