2011-09-01 28 views
2

我有一個奇怪的問題,我試圖通過一個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時常見的煩惱,因爲在許多情況下,單元/集成測試與使用真實的生產容器略有不同,所以問題無論如何都會滑落。

請幫忙。

+0

這仍然不起作用。我處於全面虧損狀態。我已經嘗試了一切。我約99歲。5%認爲這與Spring運行時或tomcat容器現在有關。 – egervari

回答

0

想一想。當公司驗證起作用時,它是否總是以公司是更大一部分的形式出現?例如,通過註冊,該公司是註冊的一部分。但是,當您嘗試在公司表單上保存公司時,它會失敗...

您可以嘗試將@ModelAttribute附加到公司arg嗎?即

@ModelAttribute @Valid Company company 

它有幫助嗎?

+0

謝謝威利。不幸的是,它沒有效果。我希望它做到了;)你對分析發生的事情是正確的。這是最古怪的事情。事實上,我有一個從以前的版本的生產應用程序,它的工作很好......但我沒有絲毫的線索,我怎麼改變可能會影響這個:/ – egervari

+0

你可以發表以下內容:(1)公司代碼的相關部分,(2)HTML表單代碼? –

+0

當然,我發佈了「公司」對象。我不認爲發佈freemarker代碼是有意義的,因爲它都是自定義的宏。放心,這是正確的。它的工作原理沒有@Valid就好,網站上還有超過100種其他表單也可以工作。 html在這裏不是問題。 – egervari