2011-12-30 3 views
4

Скажем, у меня есть класс с двумя переменными-членами:javax Проверка бина на основе переменных?

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

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

@Min(1) 
private int minimumAge; 

@Max(99) 
private int maximumAge; 

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

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

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

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

Спасибо!

ответ

2

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

С 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 для программного определения ограничения:

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

Мне нравится @ScriptAssert подход, так как это простой, простой способ определить ограничения, без необходимости реализовывать собственные ограничения. – Galen

0

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

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

-1

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

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

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