2016-11-18 3 views
2

Я создал аннотацию проверки пользовательской формы, чтобы проверить, соответствует ли дата, заполненная формой, в формате dd/MM/yyyy. К сожалению, это не работает, проверка не выполняется с любым форматом даты, который я пытаюсь выполнить. Первоначально я думал, что проблема заключается в регулярном выражении, которое я использую для тестирования, но после выполнения некоторых тестов я уверен, что он работает.аннотация не поддерживается

Что мне не хватает? Вот мой код (я копирую только соответствующие части), пожалуйста, помогите мне понять, что я сделал не так:

боб Articolo (NB: этот класс вложен в модели класса 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

У вас на самом деле есть реализация проверки валиков на вашем пути к классу ... Без этого ничего не произойдет. –

+0

Вы решили свою проблему? –

+0

Не совсем, я не уверен, что вы имеете в виду с реализацией проверки фасоли ... не могли бы вы объяснить больше? –

ответ

0

Вы можете сделать это без Regex. Весна содержит @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, которое проверяется в классе контроллера и автоматически подключается к форме). –