У меня есть модель 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, если полученные данные из базы данных уже являются целыми числами. Тогда проверка не будет работать.
И вопросы:
Любые советы для этой стратегии проверки? Я думаю, что, возможно, я не вправе проверить правильность значения Integer.
Как я могу получить неправильное введенное значение из действия, или это просто невозможно, поскольку это уже не допустимый тип данных этого поля.