JSF:通过字段从Validator访问Bean

时间:2009-07-24 16:38:54

标签: java jsf

我有一个JSF验证程序,用于检查容器编号字符串是否符合ISO-6346规范。

它工作正常,但是我需要根据容器编号来自Bean的其他值添加一些条件处理。这个Bean可以有几种不同的类型。

有没有办法在验证器中访问Bean并对其执行操作?理想情况下,我希望将其作为验证器,但如果没有解决方案,我必须在持久化之前在Bean中实现逻辑。

我正在考虑以下几点:

public class ContainerNumberValidator implements javax.faces.validator.Validator {
   public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

      Object bean = UIComponent.getMyBeanSomehowThroughAMagicMethod();
      if(bean instanceof BeanA) {
         //do this
      } else if(bean instanceof BeanB) {
         //do that
      }
}

更新:在很多方面,这与同时验证多个字段的问题类似。 BalusC的This code很有帮助。

非常感谢。

d

2 个答案:

答案 0 :(得分:5)

使用< f:attribute>可以将Bean传递给验证器,并将其作为值表达式从组件中检索。

所以我的输入是这样的(必须使用<f:validator>而不是<h:inputText>上的验证器属性):

<h:inputText id="containerNum" size="20" maxlength="20" value="#{containerStockAction.containerStock.containerNumber}">
    <f:validator validatorId="containerNumberValidator" />
    <f:attribute name="containerBean" value="#{containerStockAction.containerStock}"/>
</h:inputText>

我的验证员类:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
  String containerNumber = (String)value;
  Object containerBean = component.getValueExpression("containerBean").getValue(context.getELContext());

  if(containerBean instanceof BeanA) {
    //do this
  }

答案 1 :(得分:4)

您可以使用以下方法使用FacesContext获取您喜欢的任何旧bean。与您找到的解决方案非常相似。

public void validate(FacesContext context, UIComponent component, Object value)
{
    Application app = context.getApplication();

    ValueExpression expression = app.getExpressionFactory().createValueExpression( context.getELContext(),
            "#{thingoBean}", Object.class );

    ThingoBean thingoBean = (ThingoBean) expression.getValue( context.getELContext() );
}