我有一个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
答案 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() );
}