wake-up-neo.net

Java EE 6: Ziel nicht erreichbar, Bezeichner 'helloBean' zu Null aufgelöst

Ich versuche, ein einfaches JSF 2-Tutorial-Beispiel zum Laufen zu bringen.

Ich verwende das dynamische Webprojekt in Eclipse und veröffentliche es auf einem Glassfish 3-Server (Ausführen -> Ausführen auf Server). Die erste index.xhtml-Seite wird ordnungsgemäß geladen. Wenn ich jedoch auf eine verwaltete Bean zugreifen muss, wird der folgende Fehler angezeigt:

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

Ich habe mir die verschiedenen anderen Diskussionen zu diesem Thema angeschaut, aber die Lösungen scheinen für mich nie zu funktionieren (z. B. Hinzufügen von beans.xml, Geben der verwalteten Bean einen Namen usw., wobei Namenskonventionen befolgt werden). 

Jede Hilfe wäre dankbar.

Hier ist der Code, mit dem ich gerade arbeite:

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>

Managed Bean:

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

Sie benötigen eine JSF 2.0-kompatible /WEB-INF/faces-config.xml-Datei, damit JSF die Anmerkungen interpretieren kann.

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

Wenn Sie bereits eines haben oder das Problem dadurch nicht gelöst wird, beachten Sie bitte die Startprotokolle des Servers, wenn Sie keine Warnungen/Fehler sehen.

Ihre /WEB-INF/web.xml-Datei ist übrigens als konforme Servlet 2.5-Spezifikation deklariert. Dies ist zwar nicht unbedingt schädlich, macht aber keinen Sinn, wenn Sie einen Servlet 3.0-kompatiblen Container verwenden. Aktualisieren Sie die Stammdeklaration wie folgt:

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

Der /WEB-INF/beans.xml ist für CDI-Anmerkungen wie @Named, @Inject usw. gedacht. Nur eine vollständig leere Datei reicht aus, um sie einzuschalten. Es hat absolut keinen Bezug zu JSF-Anmerkungen wie @ManagedBean, @ManagedProperty und so weiter. Es sollte auch nicht miteinander verwechselt werden.

14
BalusC

Ich bin seit einem halben Tag mit einem solchen Problem festgefahren. Das Problem in meinem Fall wird nur angezeigt, wenn ich die WebApp von Eclipse aus ausführe. JSF 2 sucht in WEB-INF/Klassen nach kommentierten Beans und findet sie nicht. Zur Lösung dieses Problems habe ich den Build-Ausgabepfad in WebContent/WEB-INF/classes geändert. Hier ist eine detaillierte Erklärung für ähnliche Fälle: Jetty Maven Goal Jetty: run funktioniert nicht mit JSF 2.0 @ManagedBean

10
alehro

Im exakt gleichen Szenario wie bei OP (bei Eclipse, Veröffentlichung auf einem Glassfish 3-Server mit run -> run auf Server) erhalte ich genau den gleichen Fehler, bis Leerzeichen aus dem Eclipse-Projektnamen entfernt werden. Das Entfernen von Leerzeichen löste das Problem.

1
Forge_7

Ich hatte das gleiche Problem, ich habe alles versucht. Danach habe ich einfach auf "Click and Build Project", "Build Project" und den GlassFish-Server geklickt. Danach klappt es für mich erstmal :)

1
umitkilic

Bitte überprüfen Sie Ihre Kriegsdatei und prüfen Sie, ob sich Ihre Klassen im Ordner WEB-INF/classes befinden. Ich bin auf das gleiche Problem gestoßen und habe herausgefunden, dass es keine WEB-INF/classes-Ordner für Klassen gibt.

0
sendon1982