2012-03-21 13 views
17

Sto cercando di ottenere un semplice esempio di tutorial JSF 2 per funzionare.Java EE 6: Target Unreachable, identificatore 'helloBean' risolto in null

Sto utilizzando il progetto Web dinamico in Eclipse e pubblico su un server Glassfish 3 (esegui -> esegui sul server). La prima pagina index.xhtml carichi correttamente, ma quando devo accedere ad un bean gestito, viene visualizzato il seguente errore:

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

ho dato un'occhiata alle varie altre discussioni su questo argomento, tuttavia le soluzioni mai sembra funzionare per me (ad esempio aggiungendo beans.xml, dando al bean gestito un nome ecc., seguendo le convenzioni di denominazione).

Qualsiasi aiuto sarebbe apprezzato.

Ecco il codice Attualmente sto lavorando 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 gestito:

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

Se stai usando il tuo codice usando Maven, prova a eseguirlo con l'obiettivo Maven 'tomcat: run-war' invece di' tomcat: run'. Spero che questo aiuto. :) – huahsin68

+0

@stiv: allora non hai lo stesso problema dell'OP. Hai copiato il tuo codice in un gioco completamente vuoto con tutto pronto per il default? – BalusC

+0

Ho creato un progetto con Intellij IDEA, aggiunto il supporto per JSF, ma non vuole vedere il mio bean. Allo stesso tempo

risposta

13

È necessario disporre di un file /WEB-INF/faces-config.xml compatibile JSF 2.0 per consentire a JSF di interpretare le annotazioni.

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

Se avete già uno o se questo non risolve il problema, si prega di prestare attenzione ai registri di avvio del server se non si vede eventuali avvisi/errori.

A proposito, il file /WEB-INF/web.xml è dichiarato conforme alla specifica Servlet 2.5. Anche se questo potrebbe non danneggiare, non ha senso se stai utilizzando un contenitore compatibile con Servlet 3.0. Aggiornare la dichiarazione radice come segue:

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

Il /WEB-INF/beans.xml è destinata ad annotazioni CDI come @Named, @Inject e così via. Solo un file completamente vuoto è sufficiente per accenderlo. Non ha alcuna relazione con le annotazioni JSF come @ManagedBean, @ManagedProperty e così via. Inoltre, non dovrebbe essere confuso/mescolato l'uno con l'altro.

10

Sono stato bloccato con un tale problema per mezza giornata. Il problema nel mio caso appare solo quando eseguo WebApp da Eclipse. JSF 2 cerca in WEB-INF/classi per bean annotati e non li trova. Per risolvere questo ho modificato il percorso di output della build in WebContent/WEB-INF/classes. Ecco la spiegazione dettagliata di un caso simile: Jetty maven goal jetty:run does not work with JSF 2.0 @ManagedBean

+0

Questo è l'errore dello strumento di compilazione e/o del plug-in del server. Eclipse nel suo trim predefinito (senza Maven o qualsiasi plugin del server personalizzato) svolge correttamente il lavoro. – BalusC

+0

per tutti coloro che provano l'esempio di mkyong (come lo è nel 2015) http://www.mkyong.com/jsf2/jsf-2-0-hello-world-example/ questa è la soluzione !! –

0

Si prega di controllare il file di guerra e vedere se le vostre classi sono in cartella WEB-INF/classi. Mi sono imbattuto nello stesso problema e ho scoperto che non ci sono file di classe WEB-INF/cartella delle classi.

1

Nello stesso identico scenario di OP (con Eclipse, pubblicazione su un server Glassfish 3 utilizzando run -> run su server) ottengo esattamente lo stesso errore fino a rimuovere gli spazi dal nome del progetto eclipse. La semplice rimozione degli spazi ha risolto il problema.

-1

Includi @Named nel controller/fagioli ..

+0

Questa è effettivamente una delle possibili risposte al problema come descritto nel titolo della domanda, ma questo non risponde al problema come descritto nel corpo della domanda stessa. – BalusC

0

Ho avuto lo stesso problema, ho provato di tutto. Successivamente, ho fatto clic sul pulsante "Fai clic e crea progetto", sul pulsante "Crea progetto" e sul server GlassFish riavviato. Dopo, per me funziona, per ora :)

Problemi correlati