Problema con h: forma y p: ajax (Mojarra 2.0.2 y 2.0.2 Primefaces)
-
08-10-2019 - |
Pregunta
he conseguido en este sitio:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head></h:head>
<h:body>
<h:form id="form-some">
<h:inputText id="copingFilePhaseFocus">
<p:ajax event="focus" actionListener="#{installationController.startCopyingWarFile}" />
</h:inputText>
</h:form>
</h:body>
</html>
Y respaldo de frijol:
@ManagedBean(name = "installationController")
@SessionScoped
public class InstallationController implements IPluginInstallationListener {
// Some methods here (...)
public void startCopyingWarFile(ActionEvent event) {
System.out.println("\n\n\n\nStarted\n\n\n\n");
}
}
Este código se trabaja bajo MyFaces 2.0.0. Pero bajo MyFaces 2.0.2 o 2.0.2 Mojarra no. Al decirle "no funciona" me refiero a que el texto de entrada haciendo clic (enfoque) no desencadenar actionListener (texto "Iniciado" no aparece en la salida estándar). Nadie tiene un problema similar?
EDIT 1 (Después de cambiar p: ajax a f: ajax):
<p:outputPanel id="copingFilePhase">
<p:accordionPanel speed="0.2"
rendered="#{pluginInstallerWebBean.copingFilePhase}">
<p:tab
title="#{msg['installPlugin.copyingWar']} ... #{pluginInstallerWebBean.copingFilePhaseState}">
<h:form prependId="false">
<p:focus for="copingFilePhaseFocus" />
<h:inputText id="copingFilePhaseFocus"
rendered="#{pluginInstallerWebBean.copingFilePhaseFocus}"
style="display:none;">
<f:ajax event="focus"
render="copingFilePhase obtainingPluginInformationPhase"
listener="#{installationController.startCopyingWarFile}" />
</h:inputText>
</h:form>
#{msg['installPlugin.copyingWarDescription']}
</p:tab>
</p:accordionPanel>
</p:outputPanel>
<p:outputPanel id="obtainingPluginInformationPhase">(...)</p:outputPanel>
Y el error es:
javax.faces.FacesException: contiene un ID desconocido 'CopingFilePhase' - no puede localizarlo en el contexto del componente copingFilePhaseFocus
Solución
Esto puede tener dos causas:
-
El servlet de recursos Primefaces no está configurado correctamente lo que provocará que no se cargarán los archivos JavaScript necesarios. Usted debe ser capaz de verlo marcando la consola de errores JS en su navegador web por cualquier error JS cuando se enfoca la entrada. En Firefox, la consola está disponible pulsando Ctrl + Shift + J .
El servlet de recursos se cargará automáticamente en Servlet 3.0 ambientes (GlassFish v3, Tomcat 7, JBoss 6, etc), sin embargo, en ambientes de mayor edad, que tienen que configurar manualmente en
web.xml
:<servlet> <servlet-name>PrimeFaces Resource Servlet</servlet-name> <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PrimeFaces Resource Servlet</servlet-name> <url-pattern>/primefaces_resource/*</url-pattern> </servlet-mapping>
-
La firma del método es equivocado. Usted debe ser capaz de ver que mediante la lectura de los registros del servidor y ver un
javax.el.MethodNotFoundException
en los registros. El ejemplo de código en su pregunta es correcta, pero no hay ambigüedad enActionEvent
. Hay una clase con el mismo nombre en el paquetejava.awt.event
. Es posible que tenga accidentalmente (auto) importado. Verificar si es de hechojavax.faces.event.ActionEvent
y no otra cosa.
Si ninguna ayuda, es posible que desee considerar la posibilidad de sustituir el p:ajax
PrimeFaces por la norma f:ajax
JSF 2.0:
<f:ajax event="focus" listener="#{installationController.startCopyingWarFile}" />
con
public void startCopyingWarFile(AjaxBehaviorEvent event) {
// ...
}
donde AjaxBehaviorEvent
es javax.faces.event.AjaxBehaviorEvent
.