カスタムフォームの検証アノテーションを作成し、フォームに記入された日付がdd/MM/yyyyの形式であるかどうかを確認しました。残念ながらそれは動作しません、私は試して任意の日付形式で検証が失敗します。当初、問題はテスト用の正規表現だと思っていましたが、いくつかのテストをした後、動作することは間違いありません。カスタムフォームの検証アノテーションが機能しない
私には何が欠けていますか?ここに私のコードです(私は関連部分のみをコピーする)、私が間違っていたかを理解するために私を助けてください:
豆Articolo:
@Entity
@Table (name="Articolo")
public class Articolo {
@Column (name="Data")
@Temporal (TemporalType.DATE) //match the data type used in DB
@IsValidDate //check date format is dd/MM/yyyy (custom validator)
private Date data;
(NBは、このクラスは、以下の、モデルクラスNewEditArticle内にネストされました)クラスIsValidDate
@Documented //mandatory
@Constraint (validatedBy= DateValidator.class) //this class contains the validation logic
@Retention (RetentionPolicy.RUNTIME) //mandatory
public @interface IsValidDate {
//error message
String message() default "Please insert date in format dd/mm/yyyy";
Class <?>[] groups() default {}; //mandatory
Class <? extends Payload> [] payload() default {}; //mandatory
}
クラスDateValidator
public class DateValidator implements ConstraintValidator <IsValidDate, Date > {
@Override
public void initialize(IsValidDate isValidDate) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(Date data, ConstraintValidatorContext ctx) {
//convert Date data to String
String dateString=data.toString();
//format dd/MM/yyyy
String regex="(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)";
if (dateString.matches(regex)){
return true;
}
//if date doesn't match regex, return error message from IsValidDate
else {
return false;
}
}
}
モデルクラス
public class NewEditArticolo {
//ATTRIBUTES
@Valid //requested to trigger validation of bean Articolo
private Articolo articolo;
private List<Area> ListaArea;
private List<Cucina> ListaCucina;
private List<Prezzo> ListaPrezzo;
private List<Voto> ListaVoto;
private List<String> ListaImg;
//METHODS
//CONSTRUCTOR
//create article model without ID number
//used in controller POST method
public NewEditArticolo() {
populateLists();
}
//create Article model based on ID number
//if ID=0 (new Article), creates empty model
//used in controller GET method
public NewEditArticolo(int ID) throws SQLException {
// call DAOArticolo.select only if article already exists
if (ID != 0) {
DAOArticolo DAOart = new DAOArticolo();
articolo = DAOart.select(ID);
}
populateLists();
}
コントローラ
public String editArticle (Model model,
@Valid @ModelAttribute (value="nea") NewEditArticolo nea, //create NewEditArticolo object, autowire attributes from ArticleManager.jsp, add to model and validate
BindingResult result, //collect validation errors
@RequestParam (value="submit") String submit){ //get input value from ArticleManager.jsp
Articolo articolo1=nea.getArticolo();
DAOArticolo daoArt = new DAOArticolo();
//if validation fails, return form to display validation errors
if (result.hasErrors()) {
System.out.println("VALIDATION FAILED");
return "ArticleManager";
}
else {
System.out.println("VALIDATION WAS SUCCESFULL");
}
春ディスパッチャ-servlet.xml
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
実際にクラスパスにBean検証実装がありますか。それがなければ何も起こりません。 –
あなたの問題は解決しましたか? –
実際には、Beanの検証実装で何を意味するのかよくわかりません...もっと説明できますか? –