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
Validation PrimeFaces'p:向导验证不起作用_Validation_Jsf_Primefaces_Wizard - Fatal编程技术网

Validation PrimeFaces'p:向导验证不起作用

Validation PrimeFaces'p:向导验证不起作用,validation,jsf,primefaces,wizard,Validation,Jsf,Primefaces,Wizard,我有一个带有一些选项卡的p:向导。在第一个选项卡中,用户选择一个值t:selectOneRadio-我正在使用Tomahawk。这是一个必需的值 如果用户未选择值,则不会转到下一个选项卡,但不会显示验证错误。嗯 如果用户选择了一个值,转到下一个选项卡,返回到第一个选项卡并选择了一个不同的值,那么它的行为就好像这次没有选择任何值一样。也没有验证错误,但无法调用第二个选项卡 更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用操作。。。出现验证消息;它的作用就像在第一个选项卡

我有一个带有一些选项卡的p:向导。在第一个选项卡中,用户选择一个值t:selectOneRadio-我正在使用Tomahawk。这是一个必需的值

如果用户未选择值,则不会转到下一个选项卡,但不会显示验证错误。嗯

如果用户选择了一个值,转到下一个选项卡,返回到第一个选项卡并选择了一个不同的值,那么它的行为就好像这次没有选择任何值一样。也没有验证错误,但无法调用第二个选项卡

更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用操作。。。出现验证消息;它的作用就像在第一个选项卡中没有选择任何值一样

有什么解释吗

更新


PrimeFaces论坛上的解决方案对我很有效。将process=@this添加到commandButton。

这听起来可能是几个可能的问题之一。您可能会收到验证错误,但是您可能没有正确声明消息组件,或者它没有得到更新。如果是这种情况,则可能是验证错误,而您在页面上看不到这些错误

从向导组件的Primefaces指南2.2中:

AJAX和部分验证- 步骤之间的切换基于ajax,这意味着每个步骤都使用ajax动态加载。 部分验证也是内置的,通过这种方式,当您单击“下一步”时,只验证当前步骤, 如果当前步骤有效,则下一个选项卡的内容将使用ajax加载。不执行验证 当流量返回时

另一个问题可能是您的属性没有在托管bean中正确设置,这导致了验证问题。这似乎更有可能


我在想为什么除了selectOneRadio的“必需”之外还需要验证?您有有限的选择数,必须选择一个,因此不正确的值或无效值不可能。

另一件您可能要考虑的事情。

如果您在跨选项卡的必填字段方面遇到问题,可以通过在向导组件中实现流事件,在步骤之间手动执行自己的验证

    public String onFlowProcess(FlowEvent event) {  
    //First perform check to see if the user is attempting to remove the last visitor
    if ("confirm".equals(event.getNewStep()) && (visitors == null || visitors.isEmpty())) {
        log.debug("Validation failed for empty visitors");
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Visit must have at least one visitor.", null);
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return event.getOldStep();
    }

    return event.getNewStep();  
}
以及我声明flowListener事件的.xhtml文件。试试这个,看看验证消息是否消失了

<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true">
更新


PrimeFaces论坛上的解决方案对我很有效。将process=@this添加到commandButton。不知道为什么

您只需在单选按钮上输入属性required true

例:


PrimeFaces'p:向导验证问题

步骤:1 customerInformation.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">


 <p:wizard flowListener="#{customerForm.onFlowProcess}">  

       <p:tab id="information" title="Information">  
     <p:panel header="Customer Information"> 

        <h:outputLabel value="First Name" for="fName"/>
            <h:inputText id="fname" value="#{customer.fname}"/>                                                                                                                                             

            <h:outputLabel value="Last Name" for="lName"/>
            <h:inputText id="lname" value="#{customer.lname}"/>                                                             

         </panel>
       </p:tab>

         <p:tab id="details" title="Details">  
       <p:panel header="Customer Details">  

              <h:outputLabel value="Address Line 1" for="addressOne"/>
            <h:inputText id="addressOne" value="#{customer.addressOne}"/>                                                                                                                                               

            <h:outputLabel value="Address Line 2" for="addressTwo"/>
            <h:inputText id="addressTwo" value="#{customer.addressTwo}"/>   

           </panel>
       </p:tab>
  </p:wizard>
</html>

注意:不要将required=true放在xhtml文件中

感谢您抽出时间!所需的是我对selectOneRadio的唯一验证。但是向导在调用下一个选项卡后似乎忘记了该值。这似乎是一个普遍的问题:那就是。。。。奇怪的我在应用程序中使用了一个p:向导,我根本没有这个问题。而且我不知道你做错了什么。您目前使用的Primefaces和Mojarra版本是什么?我使用的是Primefaces 2.2.1,我不使用Mojarra,我使用的是MyFaces。除此之外,PrimeFaces对我来说非常有用。我在PrimeFaces论坛的某个地方读到了一个变通方法,我现在找不到链接,上面说,在以下选项卡上使用InAuthiden将有助于保留该值。然而,这对我来说是行不通的。我想我必须做一个更正,尽管我确信我已经从我最初的帖子中看到了这种行为!:当我尝试从第二个选项卡p:commandButton调用操作时,会出现所需的消息。“后退”按钮将不再工作。这是我目前使用的Primefaces的同一版本,因为它看起来是最稳定的。我会尝试使用selectOneMenu和其他没有转换器或SelectItem值的select组件,看看这是否会有所不同。改为使用字符串,看看bean属性是否保持不变。使用这种技术,值始终存在。我想我已经修好了。我发现了这个:我将process=@this添加到commandButton中,它可以正常工作。但我不知道为什么。我希望它没有副作用。嗯,非常感谢你的帮助,枫叶班!好的请将您的解决方案作为答案发布,以方便将来搜索此问题的人员。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">


 <p:wizard flowListener="#{customerForm.onFlowProcess}">  

       <p:tab id="information" title="Information">  
     <p:panel header="Customer Information"> 

        <h:outputLabel value="First Name" for="fName"/>
            <h:inputText id="fname" value="#{customer.fname}"/>                                                                                                                                             

            <h:outputLabel value="Last Name" for="lName"/>
            <h:inputText id="lname" value="#{customer.lname}"/>                                                             

         </panel>
       </p:tab>

         <p:tab id="details" title="Details">  
       <p:panel header="Customer Details">  

              <h:outputLabel value="Address Line 1" for="addressOne"/>
            <h:inputText id="addressOne" value="#{customer.addressOne}"/>                                                                                                                                               

            <h:outputLabel value="Address Line 2" for="addressTwo"/>
            <h:inputText id="addressTwo" value="#{customer.addressTwo}"/>   

           </panel>
       </p:tab>
  </p:wizard>
</html>
public class CustomerForm implements Serializable {

    private static final long serialVersionUID = 1L;

    private String fName;
    private String lName;
    private String addressOne;
    private String addressTwo;

    private static Logger logger = Logger.getLogger(CustomerForm.class.getName());                                         

    /**
     * Call this method in p:wizard tag
     * 
     */  
    public String onFlowProcess(FlowEvent event) {  
    logger.info("Current wizard step:" + event.getOldStep());  
    logger.info("Next step:" + event.getNewStep());  
        return event.getNewStep();  
    }

    /**
     * @return the fName
     */
    public String getfName() {
        return fName;
    }
    /**
     * @param fName the fName to set
     */
    public void setfName(String fName) {
        this.fName = fName;
    }
    /**
     * @return the lName
     */
    public String getlName() {
        return lName;
    }
    /**
     * @param lName the lName to set
     */
    public void setlName(String lName) {
        this.lName = lName;
    }
    /**
     * @return the addressOne
     */
    public String getAddressOne() {
        return addressOne;
    }
    /**
     * @param addressOne the addressOne to set
     */
    public void setAddressOne(String addressOne) {
        this.addressOne = addressOne;
    }
    /**
     * @return the addressTwo
     */
    public String getAddressTwo() {
        return addressTwo;
    }
    /**
     * @param addressTwo the addressTwo to set
     */
    public void setAddressTwo(String addressTwo) {
        this.addressTwo = addressTwo;
    }

}