Identificazione e risoluzione di javax.el.PropertyNotFoundException: Target irraggiungibile


127

Quando si tenta di fare riferimento a un bean gestito in EL in questo modo #{bean.entity.property}, a volte javax.el.PropertyNotFoundException: Target Unreachableviene generata un'eccezione, in genere quando si deve impostare una proprietà bean o quando deve essere invocata un'azione bean.

Sembra che ci siano cinque diversi tipi di messaggi:

  1. Destinazione Non raggiungibile, identificativo 'bean' risolto in null
  2. Target irraggiungibile, 'entità' ha restituito null
  3. Destinazione irraggiungibile, 'null' restituito null
  4. Target irraggiungibile, '' 0 '' ha restituito null
  5. Target irraggiungibile, 'BracketSuffix' ha restituito null

Che cosa vogliono dire? Come sono causati e come dovrebbero essere risolti?




Improvvisamente, questo si è rotto per me ... Ho risolto questo problema (non riconoscendo il mio bean) arrestando il server, eliminando javax.faces.jar (Mojarra), eliminando la mia directory di build e ripulendo il \ tmp \ del mio server WebLogic e \ cache \ cartelle nel dominio, riavviando il server, tentando di pubblicare e fallendo perché non riesce a trovare javax, SVN-ripristinando la cancellazione javax.faces.jar (quindi puoi semplicemente spostarlo fuori e quindi spostalo di nuovo in) e pubblicando. Improvvisamente, ha funzionato di nuovo ...
Andrew,

Controlla sempre alcune righe sopra per i pertinenti messaggi di log che si sono verificati durante la distribuzione, qui questa è stata la vera causa principale: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]E che detto bean ( FinancialAdminReceiptWebRequestBean) non è stato trovato e risolto con nullcertezza. Un altro errore comune è quello di non riavviare il server delle applicazioni dopo, ad esempio, rinominare o spostare classi / interfacce (o dimenticato clean).
Roland,

Risposte:


238

1. Destinazione irraggiungibile, identificativo 'bean' risolto in null

Questo si riduce al fatto che l'istanza del bean gestito non è stata trovata esattamente da quell'identificatore (nome del bean gestito) in EL in questo modo #{bean}.

L'identificazione della causa può essere suddivisa in tre fasi:

un. Chi gestisce il fagiolo?
b. Qual è il nome (predefinito) del bean gestito?
c. Dov'è la classe del bean di supporto?

1 bis. Chi gestisce il fagiolo?

Il primo passo sarebbe verificare quale framework di gestione dei bean è responsabile della gestione dell'istanza del bean. È JSF via @ManagedBean? O è CDI via @Named? O è primavera via @Component? Puoi assicurarti di non mescolare più annotazioni specifiche del framework di gestione dei bean sulla stessa classe di bean di supporto? Ad esempio @Named @Component, o @Named @ManagedBean, o @ManagedBean @Component. Questo è sbagliato. Il bean deve essere gestito al massimo da un framework di gestione bean e tale framework deve essere configurato correttamente. Se non hai già idea di quale scegliere, vai su Backing bean (@ManagedBean) o CDI Beans (@Named)? e integrazione JSF Spring: come iniettare un componente / servizio Spring nel bean gestito JSF?

Nel caso in cui sia JSF a gestire il bean tramite @ManagedBean, è necessario accertarsi di quanto segue:

  • La faces-config.xmldichiarazione di root è compatibile con JSF 2.0. Quindi il file XSD e il versionmust devono almeno specificare JSF 2.0 o versioni successive e quindi non 1.x.

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

    Per JSF 2.1, basta sostituire 2_0e 2.0con 2_1e2.1 , rispettivamente.

    Se utilizzi JSF 2.2 o versioni successive, assicurati di utilizzare gli xmlns.jcp.orgspazi dei nomi anziché java.sun.comin tutti i luoghi.

    <faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">

    Per JSF 2.3, basta sostituire 2_2e 2.2da 2_3e 2.3, rispettivamente.

  • Non hai importato accidentalmente javax.annotation.ManagedBeaninvece dijavax.faces.bean.ManagedBean . Fai attenzione con il completamento automatico IDE, Eclipse è noto per eseguire automaticamente il test di quello errato come primo elemento dell'elenco.

  • Non è stato eseguito l'override @ManagedBeandi una <managed-bean>voce di stile JSF 1.x nella faces-config.xmlstessa classe di bean di backup insieme a un diverso nome di bean gestito. Questo avrà la precedenza @ManagedBean. La registrazione di un bean gestito faces-config.xmlnon è necessaria poiché JSF 2.0, è sufficiente rimuoverlo.
  • Il percorso di classe di runtime è pulito e privo di duplicati nei JAR relativi all'API JSF. Assicurati di non mescolare più implementazioni JSF (Mojarra e MyFaces). Assicurati di non fornire un altro file JAR API JEF o Java EE lungo webapp quando il contenitore di destinazione raggruppa già l'API JSF fuori dalla scatola. Vedi anche la sezione "Installazione di JSF" della nostra pagina wiki JSF JSF per le istruzioni di installazione di JSF. Nel caso in cui si intenda aggiornare JSF in bundle dal contenitore da WAR invece che nel contenitore stesso, assicurarsi di aver incaricato il contenitore di destinazione di utilizzare l'API / impl JSF in bundle di WAR.
  • Se si impacchettano i bean gestiti JSF in un JAR, assicurarsi che il JAR abbia almeno un JSF 2.0 compatibile /META-INF/faces-config.xml. Vedi anche Come fare riferimento ai bean gestiti JSF forniti in un file JAR?
  • Se stai effettivamente utilizzando il Jurassic JSF 1.x e non riesci ad aggiornare, allora devi registrare il bean tramite <managed-bean>in faces-config.xmlinvece di @ManagedBean. Non dimenticare di correggere il percorso di compilazione del tuo progetto in modo tale da non avere più librerie JSF 2.x (in modo che l' @ManagedBeanannotazione non venga compilata in modo confuso con successo).


Nel caso in cui sia il CDI a gestire il bean tramite @Named, è necessario accertarsi di quanto segue:

  • CDI 1.0 (Java EE 6) richiede un /WEB-INF/beans.xmlfile per abilitare CDI in WAR. Può essere vuoto o può avere solo il seguente contenuto:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans 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/beans_1_0.xsd">
    </beans>
  • CDI 1.1 (Java EE 7) senza alcun beans.xml, o un beans.xmlfile vuoto , o con la precedente CDI 1.0 compatibile beans.xmlsi comporterà come CDI 1.0. Quando esiste un CDI 1.1 compatibile beans.xmlcon un esplicito version="1.1", per impostazione predefinita registrerà solo i @Namedbean con una CDI esplicito scopo di annotazione, come @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScoped, ecc Nel caso in cui si ha intenzione di registrare tutti i fagioli come CDI gestito fagioli, anche quelli senza un esplicito Ambito CDI, utilizzare il CDI 1.1 di seguito compatibile /WEB-INF/beans.xmlcon bean-discovery-mode="all"set (l'impostazione predefinita è bean-discovery-mode="annotated").

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
           version="1.1" bean-discovery-mode="all">
    </beans>
  • Quando si utilizza CDI 1.1+ con bean-discovery-mode="annotated"(impostazione predefinita), assicurarsi di non aver importato accidentalmente un ambito JSF come al javax.faces.bean.RequestScopedposto di un ambito CDI javax.enterprise.context.RequestScoped. Fai attenzione con il completamento automatico IDE.

  • Quando si utilizza Mojarra 2.3.0-2.3.2 e CDI 1.1+ con bean-discovery-mode="annotated"(impostazione predefinita), è necessario aggiornare Mojarra alla versione 2.3.3 o successiva a causa di un bug . Nel caso in cui non è possibile aggiornare, quindi è necessario sia per set bean-discovery-mode="all"in beans.xml, o di mettere la specifica JSF 2.3 @FacesConfigannotazione su una classe arbitraria nella guerra (in genere una sorta di un'applicazione con scope classe di avvio).
  • I contenitori EE non Java come Tomcat e Jetty non vengono spediti con CDI in bundle. È necessario installarlo manualmente. È un po 'più di lavoro che aggiungere semplicemente i JAR della libreria. Per Tomcat, assicurati di seguire le istruzioni in questa risposta: Come installare e utilizzare CDI su Tomcat?
  • Il tuo percorso di classe di runtime è pulito e privo di duplicati nei JAR relativi all'API CDI. Assicurati di non mescolare più implementazioni CDI (Weld, OpenWebBeans, ecc.). Assicurati di non fornire un altro file JAR dell'API API EE Java o CDE insieme a webapp quando il contenitore di destinazione raggruppa già l'API CDI immediatamente.
  • Se si confezionano bean gestiti CDI per le viste JSF in un JAR, assicurarsi che il JAR abbia almeno un valido /META-INF/beans.xml(che può essere tenuto vuoto).


Nel caso in cui Spring gestisca il bean tramite @Component, è necessario accertarsi di quanto segue:

  • La molla viene installata e integrata come da sua documentazione . È importante sottolineare che è necessario almeno avere questo in web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    E questo in faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (sopra tutto quello che so per quanto riguarda Spring - Non lo faccio Spring - sentiti libero di modificare / commentare con altre probabili cause legate a Spring; ad esempio alcuni problemi relativi alla configurazione XML)


Nel caso in cui sia un componente ripetitore che gestisce il bean (nidificato) tramite il suo varattributo (ad es<h:dataTable var="item"> , <ui:repeat var="item">, <p:tabView var="item">, ecc) e in realtà ottenuto un "target irraggiungibile, identificatore 'voce' deliberato di nulla", allora avete bisogno di assicurarsi di quanto segue :

  • A #{item}non viene fatto riferimento bindingnell'attributo di alcun componente figlio. Ciò non è corretto poiché l' bindingattributo viene eseguito durante il tempo di creazione della vista, non durante il tempo di rendering della vista. Inoltre, c'è fisicamente un solo componente nell'albero dei componenti che viene semplicemente riutilizzato durante ogni ciclo di iterazione. In altre parole, dovresti effettivamente utilizzare binding="#{bean.component}"invece di binding="#{item.component}". Ma molto meglio è sbarazzarsi del collegamento dei componenti al bean e investigare / chiedere l'approccio corretto per il problema che si pensava di risolvere in questo modo. Vedi anche Come funziona l'attributo 'binding' in JSF? Quando e come dovrebbe essere usato?


1b. Qual è il nome (predefinito) del bean gestito?

Il secondo passo sarebbe verificare il nome del bean gestito registrato. Le convenzioni di utilizzo JSF e Spring sono conformi alle specifiche JavaBeans mentre CDI ha eccezioni a seconda della versione / impl CDI.

  • Una FooBeanclasse di bean di supporto come di seguito,

    @Named
    public class FooBean {}

    avrà in tutti i framework di gestione dei bean un nome di bean gestito predefinito #{fooBean}, come da specifica JavaBeans.

  • Una FOOBeanclasse di bean di supporto come di seguito,

    @Named
    public class FOOBean {}

    il cui nome di classe non qualificato inizia con almeno due maiuscole in JSF e Spring avrà un nome di bean gestito predefinito esattamente il nome di classe non qualificato #{FOOBean}, anche conforme alla specificazione JavaBeans. Nel CDI, questo vale anche nelle versioni Weld rilasciate prima di giugno 2015, ma non nelle versioni Weld rilasciate dopo giugno 2015 (2.2.14 / 2.3.0.B1 / 3.0.0.A9) né in OpenWebBeans a causa di una svista in CDI spec . In quelle versioni di saldatura e in tutte le versioni di OWB è solo con il primo carattere in minuscolo #{fOOBean}.

  • Se è stato specificato esplicitamente un nome di bean gestito foocome di seguito,

    @Named("foo")
    public class FooBean {}

    o equivalentemente con @ManagedBean(name="foo")o @Component("foo"), quindi sarà disponibile solo da #{foo}e quindi non da #{fooBean}.


1 quater. Dov'è la classe del bean di supporto?

Il terzo passo sarebbe il doppio controllo se la classe del bean di backup si trova nel posto giusto nel file WAR compilato e distribuito. Assicurati di aver eseguito correttamente una pulizia completa, ricostruzione, ridistribuzione e riavvio del progetto e del server nel caso in cui tu fossi effettivamente impegnato a scrivere codice e premere con impazienza F5 nel browser. Se ancora invano, lascia che il sistema di generazione produca un file WAR, che poi estrai e controlli con uno strumento ZIP. Il .classfile compilato della classe bean di backup deve risiedere nella struttura del pacchetto in /WEB-INF/classes. Oppure, quando è impacchettato come parte di un modulo JAR, il JAR che contiene il .classfile compilato deve risiedere /WEB-INF/libe quindi non ad es. EAR /libo altrove.

Se stai usando Eclipse, assicurati che la classe del bean di supporto sia presente srce quindi no WebContent , e assicurati che Progetto> Crea automaticamente sia abilitato. Se stai usando Maven, assicurati che la classe del bean di supporto sia in src/main/javae quindi non in src/main/resourceso src/main/webapp.

Se impacchetti l'applicazione Web come parte di una EAR con EJB + WAR (s), devi assicurarti che le classi di bean di supporto siano nel modulo WAR e quindi non nel modulo EAR né nel modulo EJB. Il livello aziendale (EJB) deve essere privo di qualsiasi artefatto relativo al livello Web (WAR), in modo che il livello aziendale sia riutilizzabile su più livelli Web diversi (JSF, JAX-RS, JSP / Servlet, ecc.).


2. Target irraggiungibile, "entità" restituita nulla

Questo si riduce a quello della proprietà nidificataentity come #{bean.entity.property}restituita null. Questo di solito si rivela solo quando JSF deve impostare il valore per propertytramite un componente di input come di seguito, mentre quello #{bean.entity}effettivamente restituito null.

<h:inputText value="#{bean.entity.property}" />

È necessario assicurarsi di aver preparato in anticipo l'entità modello in un metodo @PostConstructo <f:viewAction>, o forse un add()metodo di azione nel caso in cui si stiano lavorando con elenchi CRUD e / o finestre di dialogo nella stessa vista.

@Named
@ViewScoped
public class Bean {

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() {
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    }

    // ...
}

Quanto all'importanza di @PostConstruct; farlo in un normale costruttore fallirebbe nel caso in cui si utilizzi un framework di gestione bean che utilizza proxy , come CDI. Utilizzare sempre @PostConstructper agganciare l'inizializzazione dell'istanza del bean gestito (e utilizzare @PreDestroyper agganciare la distruzione dell'istanza del bean gestito). Inoltre, in un costruttore non avresti ancora accesso alle dipendenze iniettate, vedi anche NullPointerException mentre provi ad accedere al bean @Inject nel costruttore .

Nel caso in cui entityIdvenga fornito tramite <f:viewParam>, è necessario utilizzare <f:viewAction>invece di @PostConstruct. Guarda anche Quando usare f: viewAction / preRenderView contro PostConstruct?

Devi anche assicurarti di preservare il non nullmodello durante i postback nel caso in cui lo stai creando solo con un add()metodo di azione. Il più semplice sarebbe inserire il bean nell'ambito della vista. Vedi anche Come scegliere l'ambito bean giusto?


3. Target non raggiungibile, "null" restituito null

Questo ha effettivamente la stessa causa del n. 2, solo l'implementazione EL (precedente) utilizzata è in qualche modo difettosa nel preservare il nome della proprietà da visualizzare nel messaggio di eccezione, che alla fine è stato erroneamente esposto come 'null'. Questo rende il debug e la correzione un po 'più difficili solo se hai proprietà nidificate come queste#{bean.entity.subentity.subsubentity.property} .

La soluzione è sempre la stessa: assicurarsi che l'entità nidificata in questione non lo sia null, a tutti i livelli.


4. Target irraggiungibile, '' 0 '' ha restituito null

Ciò ha anche la stessa causa del n. 2, solo l'implementazione EL (precedente) utilizzata è errata nella formulazione del messaggio di eccezione. Questo espone solo quando si utilizza la notazione di parentesi graffa []in EL come in #{bean.collection[index]}cui la #{bean.collection}stessa non è nulla, ma l'elemento nell'indice specificato non esiste. Tale messaggio deve quindi essere interpretato come:

Target irraggiungibile, 'collection [0]' ha restituito null

La soluzione è la stessa di # 2: assicurati che l'elemento di raccolta sia disponibile.


5. Target irraggiungibile, "BracketSuffix" restituito null

Questo ha in realtà la stessa causa del n. 4, solo l'implementazione EL (precedente) utilizzata è in qualche modo difettosa nel preservare l'indice di iterazione da visualizzare nel messaggio di eccezione, che alla fine ha erroneamente esposto come 'BracketSuffix' che è davvero il personaggio ]. Questo rende il debug e la correzione solo un po 'più difficile quando hai più elementi nella raccolta.


Altre possibili cause di javax.el.PropertyNotFoundException:


Sto correndo al numero 3. #{bean.entity.property}genera il valore ma <p:selectBooleanCheckbox value="#{bean.entity.property}"/>non riesce. Il mio booleano ha un setter. Una proprietà intera sulla stessa entità fa lavoro quando impiegato in un campo di input. Qualche idea?
Jasper de Vries,

Un'altra cosa che vale la pena verificare è assicurarsi che le implementazioni JSF e CDI siano integrate, il che era il mio problema: stackoverflow.com/questions/44064995/…
Jerry B. stagista n. 1

Secondo:: Target Unreachable, identifier 'bean' resolved to nullNei progetti di maven multi modulo (contenenti moduli per ejb, web, ear) assicurati che il tuo modulo web dichiari una dipendenza dal tuo modulo ejb. Senza questo il @ManagedBeannon può essere risolto usando JSF2.0 e devi dichiararli in faces-config.xml. Mi ci sono voluti circa due ore notando che non avevo dichiarato una dipendenza per includere l'ejb nel mio modulo web (avevo solo ejb e web nell'orecchio)
bish

1
@bish Gli artefatti front-end come le @ManagedBeanclassi non appartengono al livello di servizio (progetto EJB) in primo luogo. Vedi anche stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Un bean che non è serializzabile potrebbe anche causare questo errore (come sospetto sia nel caso stackoverflow.com/questions/47533584/… (ma al momento non posso provare me stesso))
Kukeltje,

6

Per coloro che sono ancora bloccati ...

Utilizzando NetBeans 8.1 e GlassFish 4.1 con CDI, per qualche motivo ho riscontrato questo problema solo localmente, non sul server remoto. Che cosa ha fatto il trucco:

-> usando javaee-web-api 7.0 invece della versione di default di pom fornita da NetBeans, che è javaee-web-api 6.0, quindi:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

-> carica questo javaee-web-api-7.0.jar come lib sul server (cartella lib nella cartella domain1) e riavvia il server.


Ciò corrisponde a "Il tuo percorso di classe di runtime è pulito e privo di duplicati nei JAR relativi all'API CDI." In altre parole, il tuo percorso di classe di runtime era in qualche modo incasinato con librerie duplicate.
BalusC

In effetti, e la tua risposta mi ha aiutato a identificare il probabile problema su cui dovrei concentrarmi ;-) Basta dimostrare qui i dettagli della mia soluzione specifica, potrebbe far risparmiare tempo a un paio di utenti.
seinecle

1

Ho deciso di condividere la mia scoperta su questo errore dopo averlo risolto da solo.

Prima di tutto, le soluzioni BalusC dovrebbero essere prese sul serio, ma poi c'è un altro probabile problema di Netbeans di cui essere consapevoli soprattutto quando si costruisce un Enterprise Application Project (EAR) usando Maven.

Netbeans genera, un file POM padre , un progetto EAR , un progetto EJB e un progetto WAR . Tutto il resto del mio progetto andava bene, e ho quasi pensato che il problema fosse probabilmente un bug in GlassFish 4.0 (dovevo installarlo e collegarlo a Netbeans) perché GlassFish 4.1 ha un bug Weld CDI che rende GlassFish 4.1 incorporato in Netbeans 8.0. 2 inutilizzabili tranne che attraverso una patch.

Soluzione:

Per risolvere il "Target irraggiungibile, identificatore 'fagiolo' deliberato di null" degli errori

I Fare clic con il pulsante destro del mouse sul progetto POM principale e selezionare Proprietà . Viene visualizzata una finestra di dialogo Proprietà progetto, fai clic su "Fonti", sarai sorpreso di vedere il " Formato sorgente / binario " impostato su 1,5 e " Codifica " impostato su Windows 1250. Cambia il " Formato sorgente / binario " su 1,6 0r 1,7, a seconda di quale preferisci rendere il tuo progetto conforme al CDI e " Codificare " in UTF-8.

Fare lo stesso per tutti gli altri sottoprogetti (EAR, EJB, WAR) se non sono già comparabili. Esegui il tuo progetto e non otterrai più questo errore.

Spero che questo aiuti qualcuno là fuori ad avere un errore simile.


Trovo la tua risposta difficile da capire in generale (a una sorta di informazione non direttamente correlata) e anche che il formato sorgente / binario e la codifica svolgono un ruolo in questo problema. Sei sicuro che cambiarlo non abbia innescato una buona / completa ricostruzione che ha risolto il problema?
Kukeltje,

1

Ho deciso di condividere la mia soluzione, perché sebbene molte risposte fornite qui fossero utili, avevo ancora questo problema. Nel mio caso, sto usando JSF 2.3, jdk10, jee8, cdi 2.0 per il mio nuovo progetto e ho eseguito la mia app su wildfly 12, avviando il server con il parametro standalone.sh -Dee8.preview.mode = true come raccomandato sul sito Web wildfly . Il problema con "bean risolto in null" è scomparso dopo aver scaricato wildfly 13. Il caricamento esattamente della stessa guerra su wildfly 13 ha reso tutto funzionante.


1

Mi sono bloccato su questo errore perché nella classe che ha @SpringBootApplicationdimenticato di specificare il nome del pacchetto del controller.

Volevo essere più specifico questa volta sottolineando quali componenti Spring doveva scansionare, invece di configurare il pacchetto base.

Era così:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service"})

Ma la forma corretta è una di queste:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller"})

@ComponentScan(basePackages = {"br.com.company.project")

Ho deciso di condividere la mia soluzione, perché sebbene la risposta corretta sia molto completa, non copre questo errore (idiota) :)


0

Nel mio caso, ho commesso un errore ortografico in @Named ("beanName"), si supponeva che fosse "beanName", ma ho scritto "beanNam", per esempio.


0

Sto usando Wildfly 10 per javaee container. Ho riscontrato il problema "Target irraggiungibile, 'entità' restituita nulla". Grazie per i suggerimenti di BalusC ma il mio problema con le soluzioni è stato spiegato. Uso accidentale "import com.sun.istack.logging.Logger;" anziché "import org.jboss.logging.Logger;" causato CDI implementato JSF EL. Spero che aiuti a migliorare la soluzione.


0

Ho avuto lo stesso problema. La soluzione si è rivelata molto più semplice. Sembra che un datatable desideri il metodo sotto forma di getter, ovvero getSomeMethod (), non solo someMethod (). Nel mio caso nel datatable stavo chiamando findResults. Ho cambiato il metodo nel mio backing bean in getFindResults () e ha funzionato.

Un commandButton ha funzionato trovare senza il get che è servito a renderlo solo più confuso.


0

Per quanto riguarda il n. 2, nel mio caso ha preso vita magicamente dopo la sostituzione

<body>

tag con

<h:body>

Dopo aver fatto diversi (più semplici, a dire il vero) progetti JSF, non mi ricordavo di aver fatto nulla di diverso impostandolo ora, e ho avuto questo tipo di errore per la prima volta. Stavo creando una pagina di accesso molto semplice (nome utente, password, utente Bean ...) e ho impostato tutto come al solito. L'unica differenza che ho notato sono i tag di cui sopra. Forse qualcuno lo trova utile.


0

Il problema nel mio caso era che includevo un costruttore che prendeva parametri ma non un costruttore vuoto con l'annotazione Inject, in questo modo.

@Inject public VisitorBean() {}

L'ho appena provato senza alcun costruttore e questo sembra funzionare anche.


0

Per 1. topic ( Target irraggiungibile, identificativo 'bean' risolto in null );

Ho verificato risposte preziose a @BalusC e agli altri condivisori, ma ho superato questo problema nel mio scenario. Dopo aver creato un nuovo xhtml con un nome diverso e creato una classe bean con un nome diverso, ho scritto (non copia-incolla) i codici passo dopo passo nella nuova classe bean e nel nuovo file xhtml.


0

Quando rimuovo il parametro di contesto AnnotationConfigWebApplicationContext dal file web.xml Questo funziona

Se hai come parametro che, come mostrato di seguito, devi rimuoverlo dal file web.xml

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

ti interessa elaborare perché questo lo risolve? O meglio perché averlo causa problemi?
Kukeltje,

-1

Lavorare con JSF nel vecchio stile Devi definire il bean gestito nel file bean-config.xml (che si trova nella cartella WEB-INF) e fare un riferimento ad esso nel file web.xml , in questo modo:

fagioli-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(Ho provato ad usare altri ambiti, ma ...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

-2

Un altro indizio: stavo usando JSF e ho aggiunto dipendenze mvn: com.sun.faces jsf-api 2.2.11

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

Quindi, ho provato a passare a Primefaces e ad aggiungere la dipendenza primefaces:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>

Ho cambiato il mio xhtml da h: a p :, aggiungendo xmlns: p = "http://primefaces.org/ui al modello. Solo con JSF il progetto funzionava bene e il fagiolo gestito veniva raggiunto bene. Quando aggiungo Primefaces Stavo ottenendo l'oggetto irraggiungibile (javax.el.propertynotfoundexception). Il problema era che JSF stava generando ManagedBean, non Primefaces, e chiedevo a Primefaces l'oggetto. Ho dovuto eliminare jsf-impl dal mio .pom, pulito e installa il progetto. Tutto è andato bene da questo punto. Spero che sia d'aiuto.


2
La tua assunzione della causa del problema non ha senso. PrimeFaces non è affatto un'implementazione JSF. Ciò corrisponde al requisito "Il tuo percorso di classe di runtime è pulito e privo di duplicati nei JAR relativi all'API CDI." In altre parole, il tuo percorso di classe di runtime era in qualche modo incasinato con librerie duplicate e PrimeFaces lo stava solo ingrandendo, non causandolo.
BalusC,

-3

EL interpreta $ {bean.propretyName} come descritto - il propertyName diventa getPropertyName () presupponendo che si stiano utilizzando metodi espliciti o impliciti per generare getter / setter

È possibile ignorare questo comportamento identificando esplicitamente il nome come una funzione: $ {bean.methodName ()} Questo chiama il metodo della funzione Name () direttamente senza modifiche.

Non è sempre vero che i tuoi accessor siano chiamati "get ...".


1
Questa non è la pratica corretta e ciò rende impossibile invocare i setter giusti dietro i componenti di input. Anche questa non può essere la causa di detta eccezione. Ciò causerebbe solo la suddetta eccezione che hai commesso l'errore di fare riferimento a una proprietà in un'espressione del metodo di azione come action="#{bean.property}"invece di action="#{bean.method}".
BalusC

straordinariamente, nel mondo della moderna java con programmazione funzionale, questa "pratica corretta" sta cambiando. Vedi dev.to/scottshipp/… e i riferimenti quali. Si noti che Lombok ha un'impostazione per "fluente" in cui get / set non vengono aggiunti. La nostra azienda ha 1000 ingegneri che sembrano avere una visione diversa della pratica corrente.
sabato

1
Penso che tu e i tuoi 1000 ingegneri state confondendo le proprietà con i metodi.
BalusC

Questa pratica di progettazione sta diventando comune nelle applicazioni su larga scala con una concorrenza molto elevata. Vorrei offrire che il tuo downvote si basa su una vista delle linee guida di progettazione, piuttosto che sul valore della risposta nell'aiutare la nostra vasta comunità a rintracciare un potenziale bug.
domenica

1
Eh? Mi dispiace, non posso ignorare l'impressione che non hai idea di cosa stai parlando.
BalusC

-3

Nel mio caso mancava "el-ri-1.0.jar".


1
Normalmente non ne hai affatto bisogno, quindi c'è qualcos'altro in questione. Molto probabilmente un percorso di classe di runtime sporco. Dovresti risolverlo invece di peggiorarlo a lungo termine aggiungendo librerie che dovrebbero essere già fornite dal server.
BalusC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.