Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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

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
Java PrimeFaces命令按钮不';如果启用了ajax,则不会调用操作_Java_Jsf 2_Primefaces - Fatal编程技术网

Java PrimeFaces命令按钮不';如果启用了ajax,则不会调用操作

Java PrimeFaces命令按钮不';如果启用了ajax,则不会调用操作,java,jsf-2,primefaces,Java,Jsf 2,Primefaces,这是我的页面: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:cpanel="http://java.sun.com/jsf/composite/components/cpanel" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.

这是我的页面:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cpanel="http://java.sun.com/jsf/composite/components/cpanel"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title></title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/templates/cpanelLayout.xhtml">
            <ui:define name="metadata">
                <f:metadata>
                    <f:viewParam name="id" value="#{linkDoctorBean.incomingDoctorId}" required="true"/>
                    <f:event type="preRenderView" listener="#{linkDoctorBean.preRenderView}"/>
                </f:metadata>
            </ui:define>
            <ui:define name="cpanelContent">
                <cpanel:adddedClinicDoctor doctor="#{linkDoctorBean.incomingDoctor}" clinic="#{linkDoctorBean.clinic}"/>
                <h:form id="form">
                    <div>
                        <h:panelGrid columns="2">
                            <p:selectOneMenu id="doctor"
                                             value="#{linkDoctorBean.doctor}"
                                             converter="#{doctorConverter}"
                                             effect="fade"
                                             var="d"
                                             height="180"
                                             validator="#{linkDoctorBean.validateDoctor}">
                                <f:selectItem itemLabel="Select a doctor" itemValue="" noSelectionOption="true"/>
                                <f:selectItems value="#{linkDoctorBean.doctors}" var="doctor" itemLabel="#{stringBean.doctorToString(doctor)}" itemValue="#{doctor}"/>
                                <p:column>
                                    <p:graphicImage value="#{applicationBean.baseResourceUrl}/doc-photo/small/#{d.urlDisplayName}"/>
                                </p:column>
                                <p:column>
                                    #{stringBean.doctorToString(d)}
                                </p:column>
                            </p:selectOneMenu>
                            <p:message id="doctorMessage" for="doctor"/>
                        </h:panelGrid>
                    </div>
                    <div style="margin-top:20px;">
                        <p:commandButton value="Link" action="#{linkDoctorBean.submit()}" update="doctorMessage" process="@all"/>
                        <h:link value="Cancel" outcome="/pages/cpanel/manage-doctors" style="margin-left:10px;"/>
                    </div>
                </h:form>
            </ui:define>
        </ui:composition>
    </h:body>
</html>
行为完全相同。在这两种情况下,提交有效选项时,验证消息似乎被清除。因此,更新/渲染正在进行,而不是进程/执行。所有后续尝试都无法执行该操作,因此在下次加载页面之前,表单实际上处于死机状态

编辑: 这似乎不是什么大问题。以下是不带素数面的表单:

    <h:form id="form">
        <div>
            <h:panelGrid columns="2">
                <h:selectOneMenu id="doctor"
                                 value="#{linkDoctorBean.doctor}"
                                 converter="#{doctorConverter}"
                                 style="width:200px;"
                                 required="true"
                                 requiredMessage="Please select a doctor"
                                 validator="#{linkDoctorBean.validateDoctor}">
                    <f:selectItem itemLabel="Select a doctor" itemValue="#{null}" noSelectionOption="true"/>
                    <f:selectItems value="#{linkDoctorBean.doctors}" var="doctor" itemLabel="#{stringBean.doctorToString(doctor)}" itemValue="#{doctor}"/>
                </h:selectOneMenu>
                <h:message id="doctorMessage" for="doctor"/>
            </h:panelGrid>
        </div>
        <div style="margin-top:20px;">
            <h:commandButton value="Link" action="#{linkDoctorBean.submit()}">
                <f:ajax execute="@form" render="doctorMessage"/>
            </h:commandButton>
            <h:link value="Cancel" outcome="/pages/cpanel/manage-doctors" style="margin-left:10px;"/>
        </div>
    </h:form>
编辑: ... 下面是来自
Doctor
实体类的两个方法:

@Override
public int hashCode()
{
    int hash = 0;
    hash += (doctorId != null ? doctorId.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object)
{
    if (!(object instanceof Doctor))
    {
        return false;
    }
    Doctor other = (Doctor) object;
    if ((this.doctorId == null && other.doctorId != null) || (this.doctorId != null && !this.doctorId.equals(other.doctorId)))
    {
        return false;
    }
    return true;
}
编辑: 如注释中所述,
DoctorConverter.getaObject
被调用三次。以下是三个调用的堆栈跟踪,顺序如下:

一,

二,

三,

下面是JSF页面中的当前表单:

<h:form id="form">
    <!-- Validating here instead of at the selectOneMenu level due to its invalidity not being cleared. -->
    <div style="clear:both;">
        <h:panelGrid columns="2">
            <h:selectOneMenu id="doctor"
                             value="#{linkDoctorBean.doctor}"
                             converter="#{doctorConverter}"
                             converterMessage="Please select a doctor"
                             style="width:200px;"
                             required="true">
                <f:selectItem itemLabel="Select a doctor" itemValue="" noSelectionOption="true"/>
                <f:selectItems value="#{linkDoctorBean.doctors}" var="doctor" itemLabel="#{stringBean.doctorToString(doctor)}" itemValue="#{doctor}"/>
            </h:selectOneMenu>
            <p:message id="doctorMessage" for="doctor"/>
        </h:panelGrid>
    </div>
    <div style="margin-top:20px;">
        <h:commandButton value="Link" action="#{linkDoctorBean.submit()}">
            <f:ajax execute="@form" render="doctorMessage"/>
        </h:commandButton>
        <h:link value="Cancel" outcome="/pages/cpanel/manage-doctors" style="margin-left:10px;"/>
    </div>
</h:form>

编辑:
已删除
DoctorConverter。getAsObject
仍被调用三次。

您的转换器已损坏。它必须基于
value
参数转换值,而不是
UIInput#getSubmittedValue()
noselection选项
值也即通过转换器传递(作为第三个跟踪提示)。如果您实际提交的值等于
noSelectionOption
值,则该值被视为无效,因此验证错误

我还建议其他小的重写;空字符串应为空

@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
    if (modelValue == null) {
        return "";
    }

    if (modelValue instanceof Doctor) {
        Long id = ((Doctor) modelValue).getId();
        return (id != null) ? String.valueOf(id) : null;
    } else {
        throw new ConverterException(new FacesMessage(modelValue + " is not a valid Doctor"));
    }
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
    if (submittedValue == null || submittedValue.isEmpty()) {
        return null;
    }

    try {
        Long id = Long.valueOf(submittedValue);
        return doctorService.find(id);
    } catch (NumberFormatException e) {
        throw new ConverterException(new FacesMessage(submittedValue + " is not a valid Doctor ID"));
    }
}
请注意,我的
web.xml
中也有这样的内容:


javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL
真的

更新:根据评论,多亏了
,还需要一些其他东西。最后,它变成了一个
,在ajax回发中被重新调用。要防止这种情况,请使用


以下内容:

converter="#{doctorConverter}"
必须写为:

converter="doctorConverter"

什么JSF impl/版本和PF版本?请尝试使用
@form
而不是
@all
。谢谢。尝试了
@表单
,没有区别。Mojarra 2.1.3(GlassFish 3.1.1),PrimeFaces 3.0 M3@BalusC,请参见第二次编辑。PrimeFaces现在不在图片中。我无法重现你的问题。也许
validatedActor()
做错了什么。顺便说一句,在转换器中,您应该从第三个参数
字符串值
@BalusC获取提交的值,我认为您可能对转换器有所了解,因此我尝试使用
,并添加了一些跟踪写入。有趣的是,转换器被调用了三次,而我希望它只被调用一次。在第二次和第三次调用中,
value
为空,而
component.submittedValue
对所有调用具有相同的值。请注意,这是PF的情况,但我假设它的行为与
h:selectOneMenu
相同。不过我会试试的。另外,我删除了验证器,因为我意识到PF(或JSF)将确保值来自列表,这是验证器所做的。您是否暗示在转换后执行
必需的
检查?或者选择
f:selectItem
占位符是否不构成违反
required=“true”
属性的内容?最重要的是,
DoctorConverter.getAsObject
应该如何处理
value.toString().length==0
的情况,这是第二次和第三次调用的情况?如果需要选择,应该使用
required=“true”
noselection选项
仅表示默认选择或不可选择的选项(例如
------------
分隔符或其他内容)。至于空字符串检查,当您使用上述上下文参数时,这是不必要的。否则,请确实检查它本身(顺便说一句,这里有一个
String#isEmpty()
方法)。。。添加
会显示另一条消息:
j_idt2:验证错误:需要值。
客户端DOM中没有j_idt2,因此我必须深入挖掘。可能不得不将FacesServlet从生产模式中移除,这意味着再见JRebel。你不会相信:这是一个奇怪的视图参数,没有为ajax调用设置。当然,它是按要求标记的。虫子来了:天啊。如果它是一个ViewScope bean,则将其设为
required=“#{!facesContext.postback}”
。我没有在我的环境中使用视图参数,因此我从未使用过它。相关:错了。在使用CDI时,以这种方式引用
@javax.inject.Named
注释转换器是完全有效的。请参见
DoctorConverter
的定义。你自己试试看。
at java.lang.Thread.dumpStack(Thread.java:1342)
at com.localgp.jsf.converter.DoctorConverter.getAsObject(DoctorConverter.java:34)
at com.localgp.jsf.converter.org$jboss$weld$bean-localgp-server-web-1$0-SNAPSHOT_war-ManagedBean-class_com$localgp$jsf$converter$DoctorConverter_$$_WeldClientProxy.getAsObject(org$jboss$weld$bean-localgp-server-web-1$0-SNAPSHOT_war-ManagedBean-class_com$localgp$jsf$converter$DoctorConverter_$$_WeldClientProxy.java)
at javax.faces.component.SelectUtils.doConversion(SelectUtils.java:191)
at javax.faces.component.SelectUtils.valueIsNoSelectionOption(SelectUtils.java:150)
at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:159)
at javax.faces.component.UIInput.validate(UIInput.java:967)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIForm.processValidators(UIForm.java:253)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:508)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1589)
at javax.faces.component.UIForm.visitTree(UIForm.java:344)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1170)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at com.localgp.NoCacheFilter.doFilter(NoCacheFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.comet.CometEngine.executeServlet(CometEngine.java:444)
at com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:308)
at com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:87)
at com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters(DefaultAsyncExecutor.java:171)
at com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:143)
at com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:94)
at com.sun.grizzly.http.TaskBase.run(TaskBase.java:193)
at com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175)
at com.sun.grizzly.arp.DefaultAsyncHandler.handle(DefaultAsyncHandler.java:145)
at com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:204)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
<h:form id="form">
    <!-- Validating here instead of at the selectOneMenu level due to its invalidity not being cleared. -->
    <div style="clear:both;">
        <h:panelGrid columns="2">
            <h:selectOneMenu id="doctor"
                             value="#{linkDoctorBean.doctor}"
                             converter="#{doctorConverter}"
                             converterMessage="Please select a doctor"
                             style="width:200px;"
                             required="true">
                <f:selectItem itemLabel="Select a doctor" itemValue="" noSelectionOption="true"/>
                <f:selectItems value="#{linkDoctorBean.doctors}" var="doctor" itemLabel="#{stringBean.doctorToString(doctor)}" itemValue="#{doctor}"/>
            </h:selectOneMenu>
            <p:message id="doctorMessage" for="doctor"/>
        </h:panelGrid>
    </div>
    <div style="margin-top:20px;">
        <h:commandButton value="Link" action="#{linkDoctorBean.submit()}">
            <f:ajax execute="@form" render="doctorMessage"/>
        </h:commandButton>
        <h:link value="Cancel" outcome="/pages/cpanel/manage-doctors" style="margin-left:10px;"/>
    </div>
</h:form>
@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
    if (modelValue == null) {
        return "";
    }

    if (modelValue instanceof Doctor) {
        Long id = ((Doctor) modelValue).getId();
        return (id != null) ? String.valueOf(id) : null;
    } else {
        throw new ConverterException(new FacesMessage(modelValue + " is not a valid Doctor"));
    }
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
    if (submittedValue == null || submittedValue.isEmpty()) {
        return null;
    }

    try {
        Long id = Long.valueOf(submittedValue);
        return doctorService.find(id);
    } catch (NumberFormatException e) {
        throw new ConverterException(new FacesMessage(submittedValue + " is not a valid Doctor ID"));
    }
}
converter="#{doctorConverter}"
converter="doctorConverter"