Seam Custom Validation

时间:2010-02-26 04:14:14

标签: hibernate validation java-ee seam

我正在尝试在Seam中实现自定义验证注释。

我们有一个对象列表,我们称之为arrayA,而arrayA因今天的日期而异。

接下来我们有一个输入字段stringB,stringB是arrayA中通过转换函数funcC(...)的一些值。

基本上,我们可以使用以下循环验证stringB:

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

我的问题是,考虑到arrayA是动态的,我如何在接缝中做到这一点? seam / hibernate验证注释似乎只将常量作为输入。有没有人知道这个问题的解决方法?

谢谢!

2 个答案:

答案 0 :(得分:2)

您始终可以在Validator中使用Seam的Component.getInstance()从您的上下文中获取数组。这假设您已经填充了包含此数组的基于Seam的Bean。

例如:

@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[]不起作用,则传入包含它的Bean。]

答案 1 :(得分:0)

首先,Seam使用的视图技术Java Server Faces 是基于服务器端的组件技术。如果你有一个动态数组属性,那么我希望你正在更新JSF树(你可以使用Ajax4JSF - 在RichFaces或ICEFaces中默认)。

如您的问题所示,您有一个复杂的验证(它涉及的不仅仅是属性,而是依赖于业务逻辑的处理)。所以最好放的地方就是你的业务逻辑。想一想。

的问候,