Шов Custom Validation - PullRequest
       12

Шов Custom Validation

1 голос
/ 26 февраля 2010

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

У нас есть список объектов, назовем его arrayA, а arrayA зависит от текущей даты.

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

Таким образом, мы можем проверить строку B, используя следующий цикл:

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Вы всегда можете использовать Component.getInstance() Шва из вашего Валидатора, чтобы получить Массив из вашего контекста. Это предполагает, что вы заполнили Бин на основе шва, содержащий этот массив.

Например:

@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[] не работает, передайте вместо нее Бин, содержащий его.]

0 голосов
/ 01 марта 2010

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

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

С уважением,

...