2011-01-14 88 views
7

我有一個Java EE應用程序,我想驗證日期。 用繩子我這樣做:JSR 303 - javax.validation - 驗證日期

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
... 
@NotNull 
@Size(min = 1, max = 255) 
private String myString; 

但現在我有,我想驗證兩個日期。用戶可以在前端系統中的文本字段中寫入一個字符串,通過JSON傳輸(我必須使用文本字段,我不能使用日期選擇器)。

所以我的後端確實有這在我的領域類:

@DateTimeFormat(pattern = "dd.MM.yy") 
@Temporal(value=TemporalType.TIMESTAMP) 
private Date myStartDate; 

@DateTimeFormat(pattern = "dd.MM.yy") 
@Temporal(value=TemporalType.TIMESTAMP) 
private Date myEndDate; 

我想驗證對格式爲「DD.MM.YYYY」。如何才能做到這一點?

而且,我不這麼認爲,但有沒有自動驗證來檢查開始日期是否在結束日期之前?我只發現@Future@Past

所以唯一的解決方案是使用@Pattern,一個正則表達式?!

預先感謝您的幫助,最好的問候。

+2

幾件事情:'@ DateTimeFormat'不是JSR-303的一部分,'mm'代表幾分鐘而不是幾個月。另外如何將''dd.MM.yy'''改爲'「dd.MM.yyyy」'失敗?既然你似乎在使用Spring MVC(這個註釋是其中的一部分),你可能想要修改/重寫你的問題。至少,JSR 303不提供[任何](http://download.oracle.com/javaee/6/api/javax/validation/constraints/package-summary.html)註釋。 – BalusC

+0

是的,我可以更改爲'dd.MM.yyyy',但沒有驗證。 – Tim

+0

由於'Date'沒有存儲任何有關其內部格式的信息,我也無法理解模式驗證如何在'Date'而不是'String'上有用。無論如何,我不做Spring,但我認爲你只需要實現一個[Validator](http://static.springsource.org/spring/docs/3.0.x/reference/validation.html)。如果是JSF,至少我會這樣做。 – BalusC

回答

3

@DateTimeFormat用於Web數據綁定期間,將請求參數映射到對象上時(假設您已通過<mvc:annotation-driven/>或手動啓用它)。將JSON反序列化爲對象時通常不會使用它。你如何閱讀你的JSON?你用什麼來反序列化它?在格式化之後,您無法驗證java Date對象,您必須在反序列化之前先檢查一下。

沒有內置多字段約束。如果要比較對象上的兩個屬性,則需要編寫自己的類型級別約束。

+0

謝謝您的回覆。我想用'@Pattern(regexp =「\ t(0 [1-9] | [12] [0-9] | 3 [01])[ - /。](0 [1-9] | 1 [012])[ - /。](19 | 20)\ d \ d \ t「)',但有一個錯誤,那就是無效的轉義序列。是的,我可以在發送到後端系統之前檢查它,但我無法訪問前端系統中,我只是「後端主服務器」,我必須檢查日期格式是否正常,所以在第一步中模式就足夠了。 – Tim

+0

您必須在java正則表達式中加倍\ \,因爲\已經是\在轉到正則表達式引擎之前,java字符串的轉義字符。 – Affe