2013-07-17 2 views
2

У меня есть модель TestModel.java, которая содержит поле, объявленных как показано нижеигра рамка проверка привязка недопустимого значения входного сигнала с POJO

@Required 
@IntegerAnnotation 
@Column (length = 4, nullable = false) 
public Integer sort; 

Для проверки по умолчанию аннотирования Play на не поддерживает проверку Integer, поэтому я создаю проверка аннотации для проверки входного значения является целым числом или нет.

IntegerAnnotation.java:

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.PARAMETER}) 
@Constraint(checkWith = IntegerCheck.class) 
public @interface IntegerAnnotation { 
    String message() default IntegerCheck.message;} 
} 

и это аннотацию относится к реализациям IntegerCheck.java

public class IntegerCheck extends AbstractAnnotationCheck<IntegerAnnotation>{ 

final static String message = "validation.integer"; 

@Override 
public boolean isSatisfied(Object validatedObject, Object value, OValContext context, Validator validator) throws OValException { 
    // TODO Auto-generated method stub 

    if(value == null) return false; 
    return isInteger(value.toString()); 
} 

private static boolean isInteger(String s) { 
    return isInteger(s,10); 
} 

private static boolean isInteger(String s, int radix) { 
    if(s.isEmpty()) return false; 
    for(int i = 0; i < s.length(); i++) { 
     if(i == 0 && s.charAt(i) == '-') { 
      if(s.length() == 1) return false; 
      else continue; 
     } 
     if(Character.digit(s.charAt(i), radix) < 0) return false; 
    } 
    return true; 
} 
} 

И есть два действия в контроллере для создания или обновления TestModel, метод создание и метод обновления.

public static void create(@Valid TestModel testModel){ 
    if(validation.hasErrors()) { 
     params.flash(); 
     validation.keep(); 
     blank(); 
    } 
} 

public static void update(@Valid TestModel testModel) { 

    if(validation.hasErrors()) { 
     params.flash(); 
     validation.keep(); 
    } 
    else{ 
     testModel.save(); 
     show(sys5000.id); 
    } 
} 

я нашел, когда поле сортировки не вводятся с целочисленным значением, то значение будет нулевым в методе создания, поэтому я ставлю, если нулевое состояние в IntegerCheck.class.

Таким образом, если значение зарегистрированного сортировки неверно напечатано, оно обнаруживает значение null и возвращает false. Хотя это не то, что я ожидаю, он будет использовать неправильное введенное значение для проверки, оно сработало ... вроде.

Проблема заключается в методе обновления. Для обновления экземпляра TestModel он не отображает неверное введенное значение, а вместо него извлекает исходное полученное значение из базы данных. Это действительно проблема, поскольку она всегда будет возвращать true, если полученные данные из базы данных уже являются целыми числами. Тогда проверка не будет работать.

И вопросы:

  1. Любые советы для этой стратегии проверки? Я думаю, что, возможно, я не вправе проверить правильность значения Integer.

  2. Как я могу получить неправильное введенное значение из действия, или это просто невозможно, поскольку это уже не допустимый тип данных этого поля.

ответ

0

Поведение, которое вы видите в методе обновления, является способом игры!

Вот relevant section из документации:

... Когда Play находит поле идентификатора, он загружает соответствующий экземпляр из базы данных, прежде чем редактировать его. Затем применяются другие параметры, предоставленные HTTP-запросом .

Так что в вашем случае, когда свойство рода является нулевым во время обновления, значение в базе данных используется.

Теперь, если бы я, чтобы попытаться добиться того, что вы пытаетесь сделать, я бы Propably сделать это таким образом:

В моей модели

@Required 
@CheckWith(IntegerCheck.class) 
public int sort; // using primitive here to avoid null values. 

static class IntegerCheck extends Check { 

    public boolean isSatisfied(Object model, Object sort) { 
     int fieldValue = (int) sort; // here you have the value as int 

     // Here you would check whatever you want and return true or false. 

     return ... 
    } 

} 
Смежные вопросы