Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在rerender上刷新JSF验证程序属性_Jsf_Facelets_Validation - Fatal编程技术网

在rerender上刷新JSF验证程序属性

在rerender上刷新JSF验证程序属性,jsf,facelets,validation,Jsf,Facelets,Validation,我对验证器组件的属性值有问题。 显然,验证程序是在我第一次访问页面时创建的 请参阅下面我的代码: <h:inputText value="#{qsetting.value}" rendered="#{qsetting.dataType=='Double'}"> <mw:validateRange min="#{qsetting.minValue}" max="#{qsetting.maxValue}" /> </h:inputText> i

我对验证器组件的属性值有问题。 显然,验证程序是在我第一次访问页面时创建的

请参阅下面我的代码:

<h:inputText value="#{qsetting.value}" rendered="#{qsetting.dataType=='Double'}">  
   <mw:validateRange min="#{qsetting.minValue}" max="#{qsetting.maxValue}" />  
</h:inputText>

inputText组件通过ajax重新提交,但显然包括显示的值。 不幸的是,qsetting.minValue和qsetting.maxValue没有刷新,导致我的验证器无法正常工作

是否有可能刷新验证器,以确保它重新检索其属性,或者只是创建验证器的新实例? 验证器类本身目前正在实现“validator,Serializable”。 另外,我正在使用jsf1.2和facelets

谢谢,
Steven

这些年来,我在非ajax环境中多次遇到这个问题,今天又遇到了。添加Ajax并不会真正改变任何事情,因为在最初构建页面时,无论是Ajax还是其他方式,验证器属性都不会再次计算

我提出的唯一解决方案是将validator属性设置为验证器表达式,然后在validate方法中计算该表达式

我提到的另一个问题(同样是JSF1.2和Facelets)是并非所有EL变量都有效。我必须使用静态托管bean作为表达式的根来访问该值。将facelet ui:param值作为根将不起作用。我还没有测试过其他可能无法正确评估的项目。这可能是由于JSF本身设计中的另一个bug造成的。看

例如,而不是:

max="#{qsetting.maxValue}"
使用

然后

更新2012-09-19:

在研究MyFaces Commons如何解决这个问题之后,更好的解决方案是更改Facelets用于评估验证器和转换器属性表达式的规则

它基本上归结为添加一个新的验证器或转换器元规则,当应用该元规则时,检查属性值是否为非文本。如果它是非文本的,则在验证器或转换器上调用一个特殊方法,该方法传入值表达式而不是当前值


此时的验证器需要将值表达式存储为状态,并在需要时对其求值。MyFaces commons提供了所有复杂的基础设施来实现这一点,但您可以转储所有这些内容,编写一个简单的自定义规则,并自己直接管理ValueExpression,这与我最初发布的内容类似。

如果您为
mw
添加了标签,这会有所帮助。我不知道那是什么。这可能是一个自定义组件吗?是的,它是一个自定义验证器。不过这里没有什么特别之处,只有两个双成员变量,都带有getter和setter。问题基本上是只有在构建页面时才会调用getter。因此,在重新加载时,组件树存在,并且不会调用验证程序的setter。因此,我的验证器中有不正确的值,我想以某种方式修复它。。。(没有测试,但我相信使用f:valiateLongRange标签会得到相同的结果)
maxExpression="qsetting.maxValue"
public String getMax(FacesContext context) {
    Application app = context.getApplication();
    ExpressionFactory exprFactory = app.getExpressionFactory();
    ValueExpression ve = exprFactory.createValueExpression(context.getELContext(),
            "#{" + getMaxExpression() + "}",
            String.class);

    Object result = ve.getValue(context.getELContext());

    return (String)result;
}

public String getMaxExpression() {
    return this.maxExpression;
}

public void setMaxExpression(String maxExpression) {
    this.maxExpression = maxExpression;
}


//// StateHolder

public boolean isTransient() {
    return isTransient;
}

public void setTransient(boolean newTransientValue) {
    isTransient = newTransientValue;
}

public Object saveState(FacesContext context) {
    Object[] state = new Object[1];
    state[0] = maxExpression;
    return state;
}

public void restoreState(FacesContext context, Object state) {
    Object[] values = (Object[]) state;
    maxExpression = (String) values[0];
}