2016-11-18 20 views
2

カスタムフォームの検証アノテーションを作成し、フォームに記入された日付が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> 
+0

実際にクラスパスにBean検証実装がありますか。それがなければ何も起こりません。 –

+0

あなたの問題は解決しましたか? –

+0

実際には、Beanの検証実装で何を意味するのかよくわかりません...もっと説明できますか? –

答えて

0

あなたは正規表現せずにそれを行うことができます。春には@DateTimeFormat注釈があります。あなたのモデルでは、次のことを行います。

@NotNull(message = "Please enter Birth Date") 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
private Date birthDate; 

カスタムエラーメッセージを追加できます。リソースフォルダの下にmessage.propertiesを作成します。このファイルの内部:

typeMismatch=Invalid date format 

重要な点は、これを構成クラスに追加することです。

@Bean 
public MessageSource messageSource() { 
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
    messageSource.setBasename("messages"); 
    return messageSource; 
} 
+0

を追加しました。アノテーションベースの検証では、message.propertiesファイルが無視されるようなデフォルトのエラーメッセージが表示されます。私の推測では、カスタムエラーメッセージは、私の場合(beanクラスArticleはコントローラクラスで検証され、フォームに自動配線されたモデルクラスNewEditArticleのフィールドです)のように、ネストされたオブジェクトの検証には機能しません。 –