web-dev-qa-db-fra.com

Java EE 6: cible inaccessible, identificateur 'helloBean' résolu en null

J'essaie de faire fonctionner un exemple de didacticiel JSF 2 simple.

J'utilise le projet Web dynamique dans Eclipse et le publie sur un serveur Glassfish 3 (exécution -> exécution sur serveur). La première page index.xhtml est chargée correctement, mais lorsque je dois accéder à un bean géré, l'erreur suivante s'affiche:

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

J'ai jeté un coup d'œil aux diverses autres discussions sur ce sujet, mais les solutions ne semblent jamais fonctionner pour moi (par exemple, ajouter beans.xml, attribuer un nom au bean géré, etc. conformément aux conventions de dénomination). 

Toute aide serait appréciée.

Voici le code avec lequel je travaille actuellement:

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>

Fève gérée:

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>
17
Lou Rous

Vous devez disposer d'un fichier /WEB-INF/faces-config.xml conforme à JSF 2.0 pour que JSF puisse interpréter les annotations.

<?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 vous en avez déjà un ou si cela ne résout pas le problème, vérifiez les journaux de démarrage du serveur si aucun avertissement/erreur ne s'affiche.

Au fait, votre fichier /WEB-INF/web.xml est déclaré conforme à la spécification Servlet 2.5. Même si cela ne nuit pas nécessairement, cela n’a aucun sens si vous utilisez un conteneur conforme à Servlet 3.0. Mettez à jour la déclaration racine comme suit:

<?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>

Le /WEB-INF/beans.xml est destiné aux annotations CDI telles que @Named, @Inject et ainsi de suite. Un fichier complètement vide suffit pour l'activer. Il n’a aucune relation avec les annotations JSF telles que @ManagedBean, @ManagedProperty et ainsi de suite. Il ne devrait pas non plus être confondu/mélangé.

14
BalusC

Je suis coincé avec un tel problème depuis une demi-journée. Le problème dans mon cas n'apparaît que lorsque j'exécute l'application Web à partir d'Eclipse. JSF 2 recherche dans WEB-INF/classes les haricots annotés et ne les trouve pas. Pour résoudre ce problème, j'ai modifié le chemin de sortie de la construction en WebContent/WEB-INF/classes. Voici l'explication détaillée d'un cas similaire: Jetty maven goal jetty: run ne fonctionne pas avec JSF 2.0 @ManagedBean

10
alehro

Dans exactement le même scénario que OP (avec Eclipse, publication sur un serveur Glassfish 3 à l’aide de la commande Exécuter -> Exécuter sur le serveur), la même erreur se produit jusqu’à la suppression des espaces dans le nom du projet Eclipse. En supprimant simplement les espaces, le problème a été résolu.

1
Forge_7

J'ai eu le même problème, j'ai tout essayé. Après cela, je viens de cliquer sur le bouton "Click and Build Project", sur le bouton "Build Project" et de redémarrer le serveur GlassFish. Après, ça marche pour moi, pour l'instant :)

1
umitkilic

Veuillez vérifier votre fichier war et voir si vos classes sont dans le dossier WEB-INF/classes . J'ai rencontré le même problème et découvert qu'il n'y a pas de dossier de fichiers WEB-INF/classes.

0
sendon1982