2010-02-26 2 views
1

Я пытаюсь реализовать пользовательскую аннотацию проверки в Seam.Seam Custom Validation

У нас есть список объектов, которые можно назвать arrayA, а arrayA отличается в зависимости от сегодняшней даты.

Далее у нас есть строка ввода B, строка B - некоторое значение в arrayA, проходящее через функцию преобразования funcC (...).

Поэтому в основном мы можем проверить stringB используя следующий цикл:

for(a : arrayA) 
{ 
    a.equals(funcC(stringB)) 
    return true 
} 
return false 

Моя проблема в том, как я делаю это в шве с учетом Arraya динамична? Аннотации проверки шва/спящего режима, по-видимому, принимают только константы в качестве входных данных. Кто-нибудь знает обходное решение этой проблемы?

Спасибо!

ответ

2

Вы всегда можете использовать, фальц-х Component.getInstance() из вашего валидатора для извлечения массива из вашего контекста. Это предполагает, что вы заселили Beam, содержащий этот массив.

Например:

@Name("someValidator") 
@Validator 
public class SomeValidator implements javax.faces.validator.Validator { 

    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 

    MyArrayBean bean = (MyArrayBean)Component.getInstance("myArrayBean"); 
    String[] arrayA = bean.getArray(); 

    for(String a : arrayA) { 
     //etc 
    } 
    } 
} 

Поочередно, если массив может меняться в зависимости от страницы вы проверяющего из; то вы всегда можете передать значение валидатору, используя <f:attribute>.

Например:

<h:inputText value="#{someBean.stringB}"> 
    <f:validator validatorId="someValidator" /> 
    <f:attribute name="arrayA" value="#{myArrayBean.array}"/> 
</h:inputText> 

И в вашем валидатор, вместо Component.getInstance() вы можете загрузить этот массив с помощью атрибута:

String[] arrayA = component.getValueExpression("arrayA").getValue(context.getELContext()); 

[Примечание если прохождения String[] Безразлично» t, затем передайте в Bean, содержащем его.]

0

Прежде всего, Java Server Faces, технология просмотра, используемая Seam, - это компонентная технология на стороне сервера. Если у вас есть динамическое свойство Array, значит я надеюсь, что вы обновляете дерево JSF (вы можете использовать Ajax4JSF по умолчанию в RichFaces или ICEFaces).

Как показано в вашем ответе, , у вас есть комплексная проверка (Это связано не только с собственностью, но и зависит от обработки бизнес-логики). Таким образом, лучшее место в вашей бизнес-логике. Думаю об этом.

С уважением,