Валидация Javax Bean на основе переменных? - PullRequest
4 голосов
/ 30 декабря 2011

Допустим, у меня есть класс с двумя переменными-членами:

import javax.validation.constraints.Min;
class Foo {
    private int minimumAge;
    private int maximumAge;
}

Я знаю, что могу проверить минимальные / максимальные значения следующим образом:

@Min(1)
private int minimumAge;

@Max(99)
private int maximumAge;

Но то, что я действительно хочусделать, чтобы убедиться, что минимальное время всегда меньше или равно максимальному.Поэтому я хочу что-то вроде этого:

@Min(1)
@Max(maximumAge)
private int minimumAge;

@Min(minumumAge)
@Max(99)
private int maximumAge;

Но это не представляется возможным с этой средой проверки, так как она может принимать только константные выражения.Есть ли способ сделать что-то подобное?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

Как сказал Зак, вы можете использовать пользовательское ограничение.

С Hibernate Validator вы могли бы альтернативно работать с ограничением @ ScriptAssert , которое позволяет определять ограничения с использованием любого JSR 223-совместимого механизма сценариев:

@ScriptAssert(lang = "javascript", script = "_this.minimumAge < _this.maximumAge")
public class MyBean {

  @Min(1)
  private int minimumAge;

  @Max(99)
  private int maximumAge;

}

Если вам действительно нужнодля динамического объявления ограничений вы можете использовать API Hibernate Validator для определения программного ограничения:

int dynamicallyCalculatedConstraintValue = ...;

ConstraintMapping mapping = new ConstraintMapping();
mapping.type( MyBean.class )
  .property( "mininumAge", FIELD )
    .constraint( new MaxDef().value( dynamicallyCalculatedConstraintValue ) );

HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure();
config.addMapping( mapping );
Validator validator = config.buildValidatorFactory().getValidator();
0 голосов
/ 03 января 2012

Это тоже что-то, что мне сказал друг, что, я думаю, может быть даже проще, чем подход @ScriptAssert:

@AssertTrue public boolean isValidAge() { return minAge < maxAge; }

0 голосов
/ 30 декабря 2011

Похоже, вам, возможно, придется создать пользовательское ограничение.

http://java.dzone.com/articles/using-hibernate-validator имеет хороший раздел по созданию (или перегрузке) ограничений - «Индивидуальные ограничения и валидаторы»

...