Jquery 表单验证失败且表单包含Primefaces outputPanel且延迟=”后,JSF ViewState在ajax调用中丢失;“真的”;属性

Jquery 表单验证失败且表单包含Primefaces outputPanel且延迟=”后,JSF ViewState在ajax调用中丢失;“真的”;属性,jquery,ajax,primefaces,jsf-2.2,omnifaces,Jquery,Ajax,Primefaces,Jsf 2.2,Omnifaces,我在p:dialog元素中有h:form,它包含一些表单字段(例如name、description..),还有一个p:outputPanel,带有deferred=“true”和deferredMode=“load”,在最佳用例场景中,一切似乎都很好。表单由viewscoped bean支持 当我尝试ajax提交表单(通过p:commandButton)时,一些必需的表单字段没有填写(或者表单验证将失败的任何其他场景),就会出现问题。来自服务器的ajax响应(更新了所有表单视图元素,包括标记为红

我在p:dialog元素中有h:form,它包含一些表单字段(例如name、description..),还有一个p:outputPanel,带有deferred=“true”和deferredMode=“load”,在最佳用例场景中,一切似乎都很好。表单由viewscoped bean支持

当我尝试ajax提交表单(通过p:commandButton)时,一些必需的表单字段没有填写(或者表单验证将失败的任何其他场景),就会出现问题。来自服务器的ajax响应(更新了所有表单视图元素,包括标记为红色的必填字段…)后,表单中的p:outputPanel元素尝试加载(更新)自身,但该p:outputPanel发送的ajax请求不包含javax.faces.ViewState。据我所知,这迫使@ViewScoped bean重新创建,失去任何bean状态并使显示的表单无效(例如,一些表单字段已填充,并且在验证失败后保留,但在出现问题的第二次ajax调用后,甚至它们都无效..)

通过使用Fiddler代理,我发现ajax调用中缺少ViewState

我的实际情况有点复杂,但归根结底是同一个问题。我使用自定义Primefaces组件,它扩展了p:outputPanel。我起初认为我的组件被窃听了,但后来我尝试使用简单的p:outputPanel并得到了相同的结果

那么,有没有办法解决这个问题?我可以手动添加ViewState吗?(omniFaces的FixViewState没有帮助…) 或者我做错了什么

此外,我还使用了MojarraJSF2.2.11、Weld 2.2.8、PF5.2、OmniFaces和ApacheTomcat8.0

@Named("databean")
@ViewScoped
public class ViewScopedBackingBean implements Serializable{

    private String name;

    public void add(ActionEvent event) {
        System.out.println("Yuhu :)");
    }

    // ...
}

web.xml

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
<context-param>
    <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>primefaces.FONT_AWESOME</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>bootstrap</param-value>
</context-param>

index.xhtml
Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
*.xhtml
javax.faces.PROJECT_阶段
发展
豆管员
javax.enterprise.inject.spi.BeanManager
primefaces.CLIENT_SIDE_验证
真的
primefaces.FONT\u太棒了
真的
javax.faces.FACELETS\u跳过\u注释
真的
主题
独自创立

请创建一个mcve。请参阅和jsf信息页面谢谢。我没有看到任何奇怪的东西,让我明天试试你的代码,看看会发生什么BalusC试图明确的是:它是最小的,意味着你不能删除任何东西,并且仍然拥有它吗fail@BalusC好的,我删除了我能想到的所有东西。。。我不知道该说什么。也许我实际上不知道JSF的一些非常重要的东西,我甚至没有意识到这一点。。但无论如何,我还是不知道这里出了什么问题:(好的,我测试了它,但是我不能复制它。ViewState参数在HTTP请求负载和HTML DOM树中都存在。您提到您只在Fiddler中检查了HTTP请求负载。要排除其中一个,请您也检查HTML DOM树?右键单击并检查webbrowser中的元素(或者按F12和tab键选择“元素”或“文档”,具体取决于webbrowser;请注意,“网络”/“网络”选项卡基本上显示了与Fiddler相同的细节,可能您也不知道这一点)
<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
<context-param>
    <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>primefaces.FONT_AWESOME</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>bootstrap</param-value>
</context-param>