Java EE 6: Destino inalcanzable, el identificador ''helloBean'' se resolvió como nulo
java-ee jsf-2 (6)
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de obtener un ejemplo simple de tutorial JSF 2 para que funcione.
Estoy utilizando el proyecto web dinámico en Eclipse y publicando en un servidor Glassfish 3 (ejecutar -> ejecutar en el servidor). La primera página index.xhtml se carga correctamente, pero cuando tengo que acceder a un bean administrado, aparece el siguiente error:
/index.xhtml @14,48 value="#{helloBean.name}": Target Unreachable, identifier ''helloBean'' resolved to null
He echado un vistazo a las otras discusiones sobre este tema, sin embargo, las soluciones nunca parecen funcionar para mí (por ejemplo, agregar beans.xml, darle un nombre al bean administrado, etc., siguiendo las convenciones de nomenclatura).
Cualquier ayuda sería apreciada.
Aquí está el código con el que estoy trabajando actualmente:
Index.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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>JSF 2.0 Hello World</title>
</h:head>
<h:body>
<h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
<h:form>
<h:inputText value="#{helloBean.name}"></h:inputText>
<h:commandButton value="Welcome Me" action="response"></h:commandButton>
</h:form>
</h:body>
</html>
response.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">
<h:head>
<title>JSF 2.0 Hello World</title>
</h:head>
<h:body bgcolor="white">
<h3>JSF 2.0 Hello World Example - welcome.xhtml</h3>
<h4>Welcome #{helloBean.name}</h4>
</h:body>
</html>
Frijol Manejado:
package java.hello1;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {
private static final long serialVersionUID = 1L;
private String name = "Ricardo";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>JavaServerFaces</display-name>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
En el mismo escenario exacto que OP (con eclipse, al publicar en un servidor Glassfish 3 usando ejecutar -> ejecutar en el servidor), obtengo exactamente el mismo error hasta eliminar espacios del Nombre del proyecto del eclipse. Simplemente eliminando cualquier espacio resuelto el problema.
He estado atrapado con un problema así durante medio día. El problema en mi caso aparece solo cuando ejecuto la aplicación web desde Eclipse. JSF 2 busca en WEB-INF / classes para los beans anotados y no los encuentra. Para resolver esto, he cambiado la ruta de salida de compilación a WebContent / WEB-INF / classes. Aquí hay una explicación detallada de un caso similar: Jetty maven goal jetty: run no funciona con JSF 2.0 @ManagedBean
Incluya @Named en su controlador / Bean ..
Por favor, compruebe su archivo war y vea si sus clases están en la carpeta WEB-INF / classes. Me encontré con el mismo problema y descubrí que no hay archivos de clase de la carpeta WEB-INF / classes.
Tuve el mismo problema, lo intenté todo. Después de eso, simplemente hice clic en el botón "Hacer clic y crear proyecto", el botón "Crear proyecto" y reinicié el servidor GlassFish. Después, me funciona, por ahora :)
/WEB-INF/faces-config.xml
tener un archivo compatible con JSF 2.0 /WEB-INF/faces-config.xml
para que JSF interprete las anotaciones.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<!-- Config here. Can even be kept empty. -->
</faces-config>
Si ya tiene uno o si eso no resuelve el problema, preste atención a los registros de inicio del servidor si no ve ninguna advertencia / error.
Por cierto, su archivo /WEB-INF/web.xml
se declara conforme a la especificación Servlet 2.5. Si bien esto no necesariamente es perjudicial, no tiene sentido si está utilizando un contenedor compatible con Servlet 3.0. Actualice la declaración de raíz de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- Config here. -->
</web-app>
El /WEB-INF/beans.xml
está /WEB-INF/beans.xml
para anotaciones de CDI como @Named
, @Inject
y así sucesivamente. Solo un archivo completamente vacío es suficiente para activarlo. No tiene ninguna relación con las anotaciones JSF como @ManagedBean
, @ManagedProperty
y así sucesivamente. Tampoco debe confundirse / mezclarse entre sí.