2010-02-26 106 views
1

我想实现煤层自定义的验证注解。Seam的自定义验证

我们有对象的列表,让我们把它叫做arrayA,并arrayA是今天的日期不同而定。

接下来我们有一个输入字段stringB,stringB是arrayA通过变换函数跳到FuncC(...)会有些价值。

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

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

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

谢谢!

回答

2

你总是可以利用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含有它来代替。]

0

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

如您的问题所示,您有一个复杂的验证(它涉及多于属性,并依赖于业务逻辑的处理)。所以最好放置在您的业务逻辑中。想想看。

问候,