2012-03-21 84 views
17

Estoy tratando de obtener un ejemplo de tutorial JSF 2 simple para que funcione.Java EE 6: Destino inalcanzable, el identificador 'helloBean' resuelto a nulo

Estoy utilizando el proyecto web dinámico en Eclipse y publicando en un servidor Glassfish 3 (ejecutar -> ejecutar en el servidor). Las primeras cargas de la página index.xhtml correctamente, pero cuando tengo que acceder a un bean gestionado, aparece el siguiente error:

/index.xhtml @14,48 value="#{helloBean.name}": Target Unreachable, identifier 'helloBean' resolved to null 

He echado un vistazo a los demás debates sobre este tema, sin embargo, las soluciones que nunca parecen funcionar para mí (por ejemplo, agregar beans.xml, darle un nombre al bean administrado, etc., siguiendo las convenciones de nombres).

Cualquier ayuda sería apreciada.

Este es el código actualmente estoy trabajando con:

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> 

bean administrado:

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> 
+4

Si está ejecutando su código usando maven, intente ejecutarlo con el objetivo de maven 'tomcat: run-war' en lugar de' tomcat: run'. Espero que esto ayude. :) – huahsin68

+0

@stiv: entonces no tienes el mismo problema que el OP. ¿No ha copiado su código en un proyecto de patio de recreo completamente vacío con todo configurado como predeterminado? – BalusC

+0

He creado un proyecto con Intellij IDEA, soporte agregado para JSF, pero no quiere ver mi bean. Al mismo tiempo,

Respuesta

13

Usted necesita tener un archivo compatible con 2.0 JSF /WEB-INF/faces-config.xml el fin de obtener JSF para interpretar 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 dispone de uno o si eso no resuelve el problema, por favor, preste atención a los registros de inicio del servidor si no hay advertencias/errores.

Por cierto, su archivo /WEB-INF/web.xml se declara conforme a la especificación Servlet 2.5. Si bien esto no necesariamente daña, no tiene sentido si está utilizando un contenedor compatible con Servlet 3.0. Actualizar la declaración de la 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 esta destinada para las anotaciones 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í.

10

Me he quedado atascado con ese problema durante medio día. El problema en mi caso solo aparece cuando ejecuto la aplicación web desde Eclipse. JSF 2 busca en WEB-INF/classes los beans anotados y no los encuentra. Para resolver esto, he cambiado la ruta de salida de construcción a WebContent/WEB-INF/classes. Aquí hay una explicación detallada de un caso similar: Jetty maven goal jetty:run does not work with JSF 2.0 @ManagedBean

+0

Esto es culpa de la herramienta de compilación y/o el complemento del servidor. Eclipse en su ajuste predeterminado (sin Maven ni ningún complemento de servidor personalizado) hace el trabajo correctamente. – BalusC

+0

para cualquiera que pruebe el ejemplo de mkyong (como lo es en 2015) http://www.mkyong.com/jsf2/jsf-2-0-hello-world-example/ esa es la solución !! –

0

Revise 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 en la carpeta WEB-INF/classes.

1

En el mismo escenario exacto que OP (con eclipse, publicando en un servidor de Glassfish 3 usando run -> ejecutar en el servidor) obtengo exactamente el mismo error hasta eliminar espacios del nombre del proyecto de eclipse. Simplemente eliminando cualquier espacio resuelto el problema.

-1

Incluir @Named en su Controlador/alubias ..

+0

Esta es de hecho una de las posibles respuestas al problema tal como se describe en el título de la pregunta, pero esto no responde al problema como se describe en el cuerpo de la pregunta en sí. – BalusC

0

que tenían el mismo problema, he intentado todo. Después de eso, simplemente hice clic en el botón "Hacer clic y generar proyecto", el botón "Crear proyecto" y el servidor GlassFish insertado nuevamente. Después, me funciona, por ahora :)

Cuestiones relacionadas