Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Jsf 2 如何提交输入被禁用且出现转换错误的表单_Jsf 2 - Fatal编程技术网

Jsf 2 如何提交输入被禁用且出现转换错误的表单

Jsf 2 如何提交输入被禁用且出现转换错误的表单,jsf-2,Jsf 2,我有以下页面/bean结构(使用MyFaces2.0.11+Tomcat6) 我有一个复选框,当选中他旁边的h:inputtext(它连接到我bean中的Integer变量)时,该复选框被启用,当复选框被取消选中时,输入被禁用,并且我有一个提交按钮,该按钮同时提交它们(整个表单) 这是密码 <h:form prependId="false"> <h:selectBooleanCheckbox id="my_len" value="#{myBean.myLenBool}"

我有以下页面/bean结构(使用MyFaces2.0.11+Tomcat6)

我有一个复选框,当选中他旁边的
h:inputtext
(它连接到我bean中的
Integer
变量)时,该复选框被启用,当复选框被取消选中时,输入被禁用,并且我有一个提交按钮,该按钮同时提交它们(整个表单)

这是密码

<h:form prependId="false">
    <h:selectBooleanCheckbox id="my_len" value="#{myBean.myLenBool}">
        <f:ajax render="my_len_input_wrapper"/>
    </h:selectBooleanCheckbox>
    <h:panelGroup id="my_len_input_wrapper">
        <h:inputText value="#{myBean.myLen}" id="my_len_input"
            disabled="#{not myBean.myLenBool}" required="#{myBean.myLenBool}">
            <f:validateLongRange minimum="1"/>
        </h:inputText>
        <h:message for="my_len_input"/>
    </h:panelGroup> 

        <h:commandButton action="#{myBean.submit}" value="submit">
            <f:ajax render="@form" execute="@form"></f:ajax>
        </h:commandButton>
</h:form>
场景如下

1) 选中复选框(将启用输入) 2) 输入无效值(例如0.5),其无效原因
myLen
是一个
Integer
3) 点击提交->将在
h:message
转换错误原因中显示错误消息 4) 取消选中复选框(它将禁用inputtext)
5) 点击提交复选框保持选中状态(虽然它不应该导致表单没有真正提交),并且输入被禁用,而不仅仅是因为真正的复选框值为false,当我再次点击提交时,复选框变为真正选中,但输入本身得到了一个空值(所有这些都会导致服务器上出现空指针异常),因此,最终我不得不使用discard按钮。

使用Mojarra 2.1.26MyFaces 2.0.11进行测试。取消选中复选框时,Mojarra更新
h:inputText
并将其保留为空,这是预期的行为,因为该值从未到达模型(验证错误)。但是,MyFaces仅将其更新为禁用模式,保留旧的输入值

这似乎是MyFaces的一个问题,即使在最新(2.1.12-2.0.18)的分支版本中也没有解决。事实上,如果您想根据某个元素的状态跳过该元素的转换/验证,那么编写一个自定义转换器/验证程序是一个不错的选择,但在您的例子中,这个问题与MyFaces的ajax循环有关,它应该像Mojarra的循环一样工作

作为解决方案,您有三种可能的选择:

  • 如果可能,切换到Mojarra实现,这将使问题消失
  • 编写一些JS代码,以便在取消选中复选框时重置输入值
  • 使用当前的解决方案,在禁用的情况下跳过服务器端的元素转换

谢谢,我想你是想在回答中使用转换词而不是验证。。。因为它是一个转换错误,阻止了表单的提交,但是我想知道是否有更好的解决方案来代替自定义的
转换器
。谢谢,我已经重写了我的答案,因为它在转换和验证阶段都是有效的。此外,我还将为您添加一些可能的解决方法!
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class myBean {
    Integer myLen;
    boolean myLenBool;

    public Integer getMyLen() {
        return myLen;
    }

    public void setMyLen(Integer myLen) {
        this.myLen = myLen;
    }

    public boolean isMyLenBool() {
        return myLenBool;
    }

    public void setMyLenBool(boolean myLenBool) {
        this.myLenBool = myLenBool;
    }

    public void submit() {
        // submit
    }

}
@FacesConverter("APCustomConverter")
public class APCustomConverter extends IntegerConverter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        if (component.getAttributes().get("disabled") != null && component.getAttributes().get("disabled").equals(true)) {
            return null;
        }
        Object retValue = super.getAsObject(context, component, value);
        return retValue;
    }
}