我正在尝试在Seam中实现自定义验证注释。
我们有一个对象列表,我们称之为arrayA,而arrayA因今天的日期而异。
接下来我们有一个输入字段stringB,stringB是arrayA中通过转换函数funcC(...)的一些值。
基本上,我们可以使用以下循环验证stringB:
for(a : arrayA)
{
a.equals( funcC( stringB ) )
return true
}
return false
我的问题是,考虑到arrayA是动态的,我如何在接缝中做到这一点? seam / hibernate验证注释似乎只将常量作为输入。有没有人知道这个问题的解决方法?
谢谢!
答案 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中默认)。
如您的问题所示,您有一个复杂的验证(它涉及的不仅仅是属性,而是依赖于业务逻辑的处理)。所以最好放的地方就是你的业务逻辑。想一想。
的问候,