2016-11-18 110 views
2

我创建了自定义表单验证注释,以检查表单中填写的日期是否为格式dd/MM/yyyy。不幸的是,它不起作用,验证失败,我试着用任何日期格式。最初,我认为问题是我用来测试的正则表达式,但在做了一些测试之后,我很确定它的工作原理。自定义表单验证注解不起作用

我错过了什么?这里是我的代码(我只复制了相关部分),请帮助我理解我做错了什么:

豆Articolo(注:这个类是嵌套模型类NewEditArticle内,下同)

@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; 

类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

你可以做,没有正则表达式。 Spring有@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 class Article是模型类NewEditArticle的字段,它在控制器类中验证并自动连接到表单)。 –