Identifizieren und Lösen von javax.el.PropertyNotFoundException: Ziel nicht erreichbar

127

Wenn Sie versuchen, eine verwaltete Bean in EL wie folgt zu referenzieren #{bean.entity.property}, wird manchmal eine javax.el.PropertyNotFoundException: Target UnreachableAusnahme ausgelöst, normalerweise, wenn eine Bean-Eigenschaft festgelegt werden soll oder wenn eine Bean-Aktion aufgerufen werden soll.

Es scheint fünf verschiedene Arten von Nachrichten zu geben:

  1. Ziel nicht erreichbar, Bezeichner 'Bean' in Null aufgelöst
  2. Ziel nicht erreichbar, 'Entität' hat null zurückgegeben
  3. Ziel nicht erreichbar, 'null' hat null zurückgegeben
  4. Ziel nicht erreichbar, '' 0 '' hat null zurückgegeben
  5. Ziel nicht erreichbar, 'BracketSuffix' hat null zurückgegeben

Was bedeuten sie alle? Wie werden sie verursacht und wie sollen sie gelöst werden?

BalusC
quelle
Plötzlich brach dies für mich zusammen ... Ich habe das Problem behoben (meine Bean wurde nicht erkannt), indem ich den Server gestoppt, javax.faces.jar (Mojarra) gelöscht, mein Build-Verzeichnis gelöscht und das \ tmp \ meines WebLogic-Servers bereinigt habe und \ cache \ Ordner in der Domäne, Starten des Servers erneut, Versuch zu veröffentlichen und Fehlschlagen, da Javax nicht gefunden werden kann, SVN-Zurücksetzen des Löschens von javax.faces.jar (Sie können ihn also einfach verschieben und dann verschieben verschieben Sie es wieder in) und veröffentlichen Sie. Plötzlich funktionierte es wieder ...
Andrew
Überprüfen Sie immer ein paar Zeilen oben auf relevante Protokollmeldungen, die bei der Bereitstellung aufgetreten sind. Hier war dies die eigentliche Grundursache: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]Und dass bean ( FinancialAdminReceiptWebRequestBean) nicht sicher gefunden und gelöst werden konnte null. Ein weiterer häufiger Fehler besteht darin, den Anwendungsserver nicht neu zu starten, nachdem z. B. Klassen / Schnittstellen umbenannt oder verschoben (oder vergessen clean) wurden.
Roland

Antworten:

238

1. Ziel nicht erreichbar, Bezeichner 'Bean' in Null aufgelöst

Dies läuft darauf hinaus, dass die verwaltete Bean-Instanz selbst nicht genau durch diesen Bezeichner (Name der verwalteten Bean) in EL gefunden werden konnte #{bean} .

Die Identifizierung der Ursache kann in drei Schritte unterteilt werden:

ein. Wer verwaltet die Bohne?
b. Wie lautet der (Standard-) Name der verwalteten Bean?
c. Wo ist die Backing Bean Klasse?

1a. Wer verwaltet die Bohne?

Der erste Schritt wäre zu überprüfen, welches Bean-Management-Framework für die Verwaltung der Bean-Instanz verantwortlich ist. Ist es JSF über @ManagedBean? Oder ist es CDI über @Named? Oder ist es Frühling über@Component ? Können Sie sicherstellen, dass Sie nicht mehrere Bean-Framework-spezifische Annotationen in derselben Backing-Bean-Klasse mischen? ZB @Named @Componentoder @Named @ManagedBeanoder @ManagedBean @Component. Das ist falsch. Die Bean muss von höchstens einem Bean-Verwaltungsframework verwaltet werden, und dieses Framework muss ordnungsgemäß konfiguriert sein. Wenn Sie bereits keine Ahnung haben, welche Sie auswählen sollen, gehen Sie zu Backing Beans (@ManagedBean) oder CDI Beans (@Named). und Spring JSF-Integration: Wie füge ich eine Spring-Komponente / einen Spring-Service in eine JSF-verwaltete Bean ein?

Für den Fall , es ist JSF , die über die Bohne ist die Verwaltung @ManagedBean, dann müssen Sie sicher , dass der folgende machen:

  • Die faces-config.xmlRoot-Deklaration ist mit JSF 2.0 kompatibel. Also die XSD-Datei und dieversion müssen also mindestens JSF 2.0 oder höher angeben und somit nicht 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">

    Für JSF 2.1 ersetzen Sie einfach 2_0 und 2.0durch 2_1und2.1 sind.

    Wenn Sie JSF 2.2 oder höher verwenden, stellen Sie sicher, dass Sie verwenden xmlns.jcp.org Namespaces anstelle von java.sun.comüberall verwenden.

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

    Für JSF 2.3 ersetzen Sie einfach 2_2 und 2.2durch 2_3und 2.3sind.

  • Sie haben nicht versehentlich importiert javax.annotation.ManagedBean statt javax.faces.bean.ManagedBean. Achten Sie bei der automatischen Vervollständigung der IDE darauf, dass Eclipse den falschen als ersten Eintrag in der Liste automatisch empfiehlt.

  • Sie haben das nicht @ManagedBeandurch einen JSF 1.x-Stil überschrieben<managed-bean> Eintrag im in faces-config.xmlderselben Backing-Bean-Klasse zusammen mit einem anderen Namen für verwaltete Beans . Dieser wird Vorrang vor haben @ManagedBean. Das Registrieren einer verwalteten Bean in faces-config.xmlist seit JSF 2.0 nicht erforderlich. Entfernen Sie sie einfach.
  • Ihr Laufzeitklassenpfad ist sauber und frei von Duplikaten in JSF-API-bezogenen JARs. Stellen Sie sicher, dass Sie nicht mehrere JSF-Implementierungen (Mojarra und MyFaces) mischen. Stellen Sie sicher, dass Sie keine weitere JSF- oder Java EE API-JAR-Datei in der Webanwendung bereitstellen, wenn der Zielcontainer die JSF-API bereits standardmäßig bündelt. Anweisungen zur JSF-Installation finden Sie auch im Abschnitt "Installieren von JSF" auf unserer JSF-Wiki-Seite . Wenn Sie beabsichtigen, in Containern gebündeltes JSF von WAR auf anstatt in Container selbst zu aktualisieren, stellen Sie sicher, dass Sie den Zielcontainer angewiesen haben, WAR-gebündeltes JSF API / impl zu verwenden.
  • Wenn Sie JSF-verwaltete Beans in eine JAR verpacken, stellen Sie sicher, dass die JAR mindestens mit JSF 2.0 kompatibel ist /META-INF/faces-config.xml. Siehe auch Verweisen auf JSF-verwaltete Beans, die in einer JAR-Datei bereitgestellt werden.
  • Wenn Sie tatsächlich das jurassic JSF 1.x verwenden und kein Upgrade durchführen können, müssen Sie die Bean über <managed-bean>in faces-config.xmlanstelle von registrieren @ManagedBean. Vergessen Sie nicht, Ihren Projekterstellungspfad so festzulegen, dass Sie keine JSF 2.x-Bibliotheken mehr haben (damit die @ManagedBeanAnnotation nicht verwirrend erfolgreich kompiliert wird).


Für den Fall , es ist CDI , die über die Bohne ist die Verwaltung @Named, dann müssen Sie sicher , dass der folgende machen:

  • CDI 1.0 (Java EE 6) benötigt eine /WEB-INF/beans.xmlDatei, um CDI in WAR zu aktivieren. Es kann leer sein oder nur den folgenden Inhalt haben:

    <?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) ohne beans.xmloder eine leere beans.xmlDatei oder mit dem oben genannten CDI 1.0-kompatiblen beans.xmlVerhalten verhält sich genauso wie CDI 1.0. Wenn es ein CDI 1.1 kompatibel ist beans.xmlmit einem expliziten version="1.1", dann wird es standardmäßig registriert nur @NamedBohnen mit einer expliziten CDI Umfang Anmerkung wie @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScopedusw. Falls Sie beabsichtigt, alle Bohnen registrieren als CDI Bohnen verwaltet, auch solche ohne explizite Verwenden Sie für den CDI-Bereich das unten stehende CDI 1.1, das /WEB-INF/beans.xmlmit bean-discovery-mode="all"set kompatibel ist (die Standardeinstellung ist 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>
  • Stellen Sie bei Verwendung von CDI 1.1+ mit bean-discovery-mode="annotated"(Standard) sicher, dass Sie nicht versehentlich einen JSF-Bereich importiert haben, z. B. javax.faces.bean.RequestScopedanstelle eines CDI-Bereichsjavax.enterprise.context.RequestScoped . Achten Sie auf die automatische Vervollständigung der IDE.

  • Wenn Sie Mojarra 2.3.0-2.3.2 und CDI 1.1+ mit bean-discovery-mode="annotated"(Standard) verwenden, müssen Sie Mojarra aufgrund eines Fehlers auf 2.3.3 oder neuer aktualisieren . In Fall können Sie nicht aktualisieren, dann müssen Sie entweder Satz bean-discovery-mode="all"in beans.xml, oder die JSF 2.3 spezifischen setzen@FacesConfig Anmerkung auf einer beliebigen Klasse in der WAR ( in der Regel eine Art von einem Start der Anwendung Klasse scoped).
  • Nicht-Java-EE-Container wie Tomcat und Jetty werden nicht mit CDI-Paket geliefert. Sie müssen es manuell installieren. Es ist ein bisschen mehr Arbeit als nur das Hinzufügen der Bibliotheks-JARs. Stellen Sie bei Tomcat sicher, dass Sie die Anweisungen in dieser Antwort befolgen: Wie installiere und verwende ich CDI auf Tomcat?
  • Ihr Laufzeitklassenpfad ist sauber und frei von Duplikaten in CDI-API-bezogenen JARs. Stellen Sie sicher, dass Sie nicht mehrere CDI-Implementierungen (Weld, OpenWebBeans usw.) mischen. Stellen Sie sicher, dass Sie keine weitere CDI- oder Java EE API-JAR-Datei in der Webanwendung bereitstellen, wenn der Zielcontainer die CDI-API bereits sofort bündelt.
  • Wenn Sie CDI-verwaltete Beans für JSF-Ansichten in eine JAR packen, stellen Sie sicher, dass die JAR mindestens eine gültige /META-INF/beans.xml(die leer bleiben kann) hat.


Wenn es Spring ist , der die Bean über verwaltet @Component, müssen Sie Folgendes sicherstellen:

  • Spring wird gemäß seiner Dokumentation installiert und integriert . Wichtig ist, dass Sie mindestens Folgendes haben web.xml:

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

    Und das in faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (Vor allem ist alles, was ich in Bezug auf Spring weiß - ich mache Spring nicht - zögern Sie nicht, andere wahrscheinliche Spring-bezogene Ursachen zu bearbeiten / zu kommentieren, z. B. einige Probleme im Zusammenhang mit der XML-Konfiguration)


Im Fall ist es eine Repeater - Komponente , die den (verschachtelten) Bean über sein Managing varAttribut (zB <h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">etc) , und Sie haben tatsächlich eine „Ziel nicht erreichbar, Kennung‚item‘gelöst null“, dann müssen Sie sicher , dass der folgende machen ::

  • Auf das #{item}wird in bindingattribtue einer untergeordneten Komponente nicht verwiesen . Dies ist falsch, da das bindingAttribut während der Ansichtserstellungszeit und nicht während der Ansichtsrenderzeit ausgeführt wird. Darüber hinaus gibt es physisch nur eine Komponente im Komponentenbaum, die bei jeder Iterationsrunde einfach wiederverwendet wird. Mit anderen Worten, Sie sollten tatsächlich binding="#{bean.component}"anstelle von verwenden binding="#{item.component}". Aber viel besser ist es, die Komponenten-Bining-Funktion für Bean vollständig zu beseitigen und den richtigen Ansatz für das Problem zu untersuchen / zu erfragen, von dem Sie dachten, dass es auf diese Weise gelöst werden könnte. Siehe auch Wie funktioniert das Attribut 'Bindung' in JSF? Wann und wie soll es angewendet werden?


1b. Wie lautet der (Standard-) Name der verwalteten Bean?

Der zweite Schritt wäre die Überprüfung des registrierten verwalteten Bean-Namens. JSF- und Spring-Verwendungskonventionen entsprechen der JavaBeans-Spezifikation, während CDI abhängig von CDI impl / version Ausnahmen aufweist.

  • Eine FooBeanBacking Bean Klasse wie unten,

    @Named
    public class FooBean {}

    wird in allen Bean-Management-Frameworks den Standardnamen für verwaltete Bean #{fooBean}gemäß JavaBeans-Spezifikation haben.

  • Eine FOOBeanBacking Bean Klasse wie unten,

    @Named
    public class FOOBean {}

    deren unqualifizierter Klassenname mit mindestens zwei Großbuchstaben beginnt, wird in JSF und Spring einen standardmäßig verwalteten Bean-Namen haben, der genau dem unqualifizierten Klassennamen #{FOOBean}entspricht. Entspricht auch der JavaBeans-Spezifikation. In CDI ist dies auch bei Schweißversionen der Fall, die vor Juni 2015 veröffentlicht wurden, jedoch nicht bei Schweißversionen, die nach Juni 2015 veröffentlicht wurden (2.2.14 / 2.3.0.B1 / 3.0.0.A9), oder bei OpenWebBeans aufgrund eines Versehens in CDI spec . In diesen Weld-Versionen und in allen OWB-Versionen wird nur das erste Zeichen in Kleinbuchstaben geschrieben#{fOOBean} .

  • Wenn Sie explizit einen verwalteten Bean-Namen foowie unten angegeben haben,

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

    oder gleichwertig mit @ManagedBean(name="foo")oder @Component("foo"), dann wird es nur von #{foo}und somit nicht von verfügbar sein #{fooBean}.


1c. Wo ist die Backing Bean Klasse?

Der dritte Schritt wäre eine doppelte Überprüfung, wenn sich die Backing-Bean-Klasse an der richtigen Stelle in der erstellten und bereitgestellten WAR-Datei befindet. Stellen Sie sicher, dass Sie das Projekt und den Server vollständig bereinigt, neu erstellt, erneut bereitgestellt und neu gestartet haben, falls Sie tatsächlich mit dem Schreiben von Code beschäftigt waren und ungeduldig F5 im Browser gedrückt haben. Wenn dies immer noch vergebens ist, lassen Sie das Build-System eine WAR-Datei erstellen, die Sie dann extrahieren und mit einem ZIP-Tool überprüfen. Die kompilierte .classDatei der Backing-Bean-Klasse muss sich in ihrer Paketstruktur in befinden /WEB-INF/classes. Wenn es als Teil eines JAR-Moduls gepackt ist, .classmuss sich die JAR, die die kompilierte Datei enthält, in /WEB-INF/libund daher nicht z. B. EARs /liboder anderswo befinden.

Wenn Sie Eclipse verwenden, stellen Sie sicher, dass die Backing-Bean-Klasse aktiviert ist srcund daher nicht WebContent , und stellen Sie sicher, dass Projekt> Automatisch erstellen aktiviert ist. Wenn Sie Maven verwenden, stellen Sie sicher, dass sich die Backing-Bean-Klasse in src/main/javaund somit nicht in src/main/resourcesoder befindet src/main/webapp.

Wenn Sie die Webanwendung als Teil einer EAR mit EJB + WAR (s) verpacken, müssen Sie sicherstellen, dass sich die Backing-Bean-Klassen im WAR-Modul und damit weder im EAR-Modul noch im EJB-Modul befinden. Die Business-Schicht (EJB) muss frei von Artefakten im Zusammenhang mit der Web-Schicht (WAR) sein, damit die Business-Schicht über mehrere verschiedene Web-Ebenen (JSF, JAX-RS, JSP / Servlet usw.) wiederverwendet werden kann.


2. Ziel nicht erreichbar, 'Entität' hat null zurückgegeben

Dies läuft darauf hinaus, dass die verschachtelte Eigenschaft entitywie #{bean.entity.property}zurückgegeben zurückgegeben wird null. Dies wird normalerweise nur angezeigt, wenn JSF den Wert für über eine Eingabekomponente wie unten festlegen muss property, während die #{bean.entity}tatsächlich zurückgegeben wird null.

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

Sie müssen sicherstellen, dass Sie die Modellentität zuvor in einer @PostConstructoder <f:viewAction>-Methode oder einer add()Aktionsmethode vorbereitet haben , falls Sie mit CRUD-Listen und / oder -Dialogen in derselben Ansicht arbeiten.

@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();
    }

    // ...
}

In Bezug auf die Bedeutung von @PostConstruct; Dies in einem regulären Konstruktor zu tun, würde fehlschlagen, wenn Sie ein Bean-Management-Framework verwenden, das Proxys wie CDI verwendet. Verwenden Sie @PostConstructdiese Option immer, um die Initialisierung einer verwalteten Bean-Instanz zu aktivieren (und um @PreDestroydie Zerstörung einer verwalteten Bean-Instanz zu aktivieren). Außerdem hätten Sie in einem Konstruktor noch keinen Zugriff auf injizierte Abhängigkeiten. Siehe auch NullPointerException, wenn Sie versuchen, auf die @ Inject-Bean im Konstruktor zuzugreifen .

Falls das entityIdüber geliefert wird <f:viewParam>, müssten Sie <f:viewAction>stattdessen verwenden @PostConstruct. Siehe auch Wann wird f: viewAction / preRenderView im Vergleich zu PostConstruct verwendet?

Sie müssen auch sicherstellen, dass Sie das nullNichtmodell bei Postbacks beibehalten, falls Sie es nur in einer add()Aktionsmethode erstellen . Am einfachsten wäre es, die Bohne in den Ansichtsbereich zu stellen. Siehe auch So wählen Sie den richtigen Bean-Bereich aus.


3. Ziel nicht erreichbar, 'null' hat null zurückgegeben

Dies hat tatsächlich die gleiche Ursache wie # 2, nur die (ältere) verwendete EL-Implementierung ist etwas fehlerhaft, wenn es darum geht, den in der Ausnahmemeldung anzuzeigenden Eigenschaftsnamen beizubehalten, der letztendlich fälschlicherweise als 'null' angezeigt wird. Dies macht das Debuggen und Beheben nur dann etwas schwieriger, wenn Sie einige verschachtelte Eigenschaften wie diese haben #{bean.entity.subentity.subsubentity.property}.

Die Lösung ist immer noch dieselbe: Stellen Sie sicher, dass die betreffende verschachtelte Entität nicht nullauf allen Ebenen vorhanden ist.


4. Ziel nicht erreichbar, '' 0 '' hat null zurückgegeben

Dies hat auch die gleiche Ursache wie # 2, nur die (ältere) verwendete EL-Implementierung ist fehlerhaft bei der Formulierung der Ausnahmemeldung. Dies wird nur angezeigt, wenn Sie []in EL die Klammernotation verwenden, #{bean.collection[index]}bei der das #{bean.collection}selbst nicht null ist, das Element am angegebenen Index jedoch nicht vorhanden ist. Eine solche Nachricht muss dann interpretiert werden als:

Ziel nicht erreichbar, 'Sammlung [0]' hat null zurückgegeben

Die Lösung ist auch die gleiche wie bei Nummer 2: Stellen Sie sicher, dass das Sammlungsobjekt verfügbar ist.


5. Ziel nicht erreichbar, 'BracketSuffix' hat null zurückgegeben

Dies hat tatsächlich die gleiche Ursache wie # 4, nur die verwendete (ältere) EL-Implementierung ist etwas fehlerhaft, wenn es darum geht, den in der Ausnahmemeldung anzuzeigenden Iterationsindex beizubehalten, der letztendlich fälschlicherweise als 'BracketSuffix' angezeigt wird, was eigentlich das Zeichen ist ]. Dies erschwert das Debuggen und Beheben nur, wenn Sie mehrere Elemente in der Sammlung haben.


Andere mögliche Ursachen für javax.el.PropertyNotFoundException:

BalusC
quelle
Ich stoße auf Nummer 3. #{bean.entity.property}Gibt den Wert aus, <p:selectBooleanCheckbox value="#{bean.entity.property}"/>schlägt aber fehl. Mein Boolescher Wert hat einen Setter. Eine Integer-Eigenschaft für dieselbe Entität funktioniert , wenn sie in einem Eingabefeld verwendet wird. Irgendwelche Ideen?
Jasper de Vries
Eine andere Sache, die überprüft werden sollte, ist sicherzustellen, dass Ihre JSF- und CDI-Implementierungen integriert sind, was mein Problem war: stackoverflow.com/questions/44064995/…
Jerry B. Nr. 1 Praktikant
Laut Target Unreachable, identifier 'bean' resolved to null:: Stellen Sie in Maven-Projekten mit mehreren Modulen (die Module für ejb, web, ear enthalten) sicher, dass Ihr Webmodul eine Abhängigkeit von Ihrem ejb-Modul deklariert. Ohne das @ManagedBeankann das nicht mit JSF2.0 gelöst werden und man muss sie in deklarieren faces-config.xml. Ich brauchte ungefähr zwei Stunden, um zu bemerken, dass ich keine Abhängigkeit deklariert hatte, um das EJB in mein Web-Modul aufzunehmen (hatte nur EJB und Web in meinem Ohr)
Bish
1
@bish Front-End-Artefakte wie @ManagedBeanKlassen gehören nicht in erster Linie zur Service-Schicht (EJB-Projekt). Siehe auch stackoverflow.com/questions/13011392/jsf-service-layer
BalusC
Könnte eine Bean, die nicht serialisierbar ist, auch zu diesem Fehler führen (wie ich vermute, ist dies bei stackoverflow.com/questions/47533584/… der Fall (kann mich aber derzeit nicht selbst
testen
6

Für diejenigen, die noch stecken ...

Bei Verwendung von NetBeans 8.1 und GlassFish 4.1 mit CDI hatte ich dieses Problem aus irgendeinem Grund nur lokal, nicht auf dem Remote-Server. Was hat der Trick gemacht:

-> Verwenden von Javaee-Web-API 7.0 anstelle der von NetBeans bereitgestellten Standard-POM-Version JavaE-Web-API 6.0.

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

-> Laden Sie diese javaee-web-api-7.0.jar als lib auf den Server hoch (lib-Ordner im Ordner domain1) und starten Sie den Server neu.

Seinecle
quelle
Dies entspricht "Ihr Laufzeitklassenpfad ist sauber und frei von Duplikaten in CDI-API-bezogenen JARs." Mit anderen Worten, Ihr Laufzeitklassenpfad wurde in irgendeiner Weise mit doppelten Bibliotheken durcheinander gebracht.
BalusC
In der Tat, und Ihre Antwort hat mir geholfen, das wahrscheinliche Problem zu identifizieren, auf das ich mich konzentrieren sollte ;-) Wenn Sie hier nur die Details meiner spezifischen Lösung nachweisen, kann dies einigen Benutzern Zeit sparen.
Seinecle
1

Ich beschloss, meine Erkenntnisse zu diesem Fehler zu teilen, nachdem ich ihn selbst behoben hatte.

Zunächst sollten BalusC-Lösungen ernst genommen werden, aber dann gibt es ein weiteres wahrscheinliches Problem in Netbeans, das Sie berücksichtigen sollten, insbesondere beim Erstellen eines Enterprise Application Project (EAR). mit Maven.

Netbeans generiert eine übergeordnete POM-Datei , ein EAR-Projekt , ein EJB-Projekt und ein WAR-Projekt . Alles andere in meinem Projekt war in Ordnung und ich nahm fast an, dass das Problem ein Fehler in wahrscheinlich GlassFish 4.0 ist (ich musste es installieren und in Netbeans einstecken), da GlassFish 4.1 einen Weld CDI-Fehler hat, der das eingebettete GlassFish 4.1 in Netbeans 8.0 macht. 2 unbrauchbar außer durch einen Patch.

Lösung:

Um den Fehler "Ziel nicht erreichbar, Bezeichner 'Bean' auf Null aufgelöst" zu beheben,

I Klicken Sie mit der rechten Maustaste auf das übergeordnete POM-Projekt und wählen Sie Eigenschaften . Ein Dialogfeld mit den Projekteigenschaften wird angezeigt. Klicken Sie auf "Quellen". Sie werden überrascht sein, dass " Quell- / Binärformat " auf 1,5 und " Codierung " auf Windows 1250 eingestellt sind. Ändern Sie das " Quell- / Binärformat" auf 1,6 bis 1,7 Sie bevorzugen es, Ihr Projekt CDI-kompatibel zu machen und UTF-8 zu " kodieren ".

Machen Sie dasselbe für alle anderen Teilprojekte (EAR, EJB, WAR), wenn sie noch nicht teilbar sind. Führen Sie Ihr Projekt aus, und dieser Fehler wird nicht erneut angezeigt.

Ich hoffe, das hilft jemandem da draußen, der einen ähnlichen Fehler hat.

Gbenga Adebowale
quelle
Ich finde Ihre Antwort im Allgemeinen schwer zu verstehen (zu viele nicht direkt verwandte Informationen) und auch, dass das Quell- / Binärformat und die Codierung in dieser Ausgabe eine Rolle spielen. Sind Sie sicher, dass eine Änderung nicht nur einen guten / vollständigen Neuaufbau ausgelöst hat, der das Problem gelöst hat?
Kukeltje
1

Ich habe beschlossen, meine Lösung zu teilen, denn obwohl viele der hier gegebenen Antworten hilfreich waren, hatte ich immer noch dieses Problem. In meinem Fall verwende ich JSF 2.3, jdk10, jee8, cdi 2.0 für mein neues Projekt und habe meine App auf Wildfly 12 ausgeführt und den Server mit dem Parameter standalone.sh -Dee8.preview.mode = true gestartet, wie auf der Wildfly-Website empfohlen . Das Problem mit "Bean auf Null gelöst" verschwand nach dem Herunterladen von Wildfly 13. Durch das Hochladen des gleichen Krieges auf Wildfly 13 funktionierte alles.

Urszula Szczęśniak
quelle
1

Ich bin bei diesem Fehler hängen geblieben, weil ich in der Klasse, in der @SpringBootApplicationich vergessen habe, den Paketnamen des Controllers anzugeben.

Diesmal wollte ich genauer darauf hinweisen, welche Komponenten Spring scannen musste, anstatt das Basispaket zu konfigurieren.

Es war so:

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

Aber die richtige Form ist eine davon:

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

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

Ich habe beschlossen, meine Lösung zu teilen, denn obwohl die richtige Antwort sehr umfassend ist, deckt sie diesen (idiotischen) Fehler nicht ab :)

Claudiomir
quelle
0

In meinem Fall habe ich in @Named ("beanName") einen Rechtschreibfehler begangen. Es wurde angenommen, dass es sich um "beanName" handelt, aber ich habe beispielsweise "beanNam" geschrieben.

lfvv
quelle
0

Ich benutze Wildfly 10 für Javaee Container. Ich hatte das Problem "Ziel nicht erreichbar, 'Entität' hat null zurückgegeben" festgestellt. Vielen Dank für Vorschläge von BalusC, aber das mein Problem aus den Lösungen erklärt. Versehentlich mit "import com.sun.istack.logging.Logger;" anstelle von "import org.jboss.logging.Logger;" verursacht CDI implementiert JSF EL. Hoffe, es hilft, die Lösung zu verbessern.

Osman Corluk
quelle
0

Ich hatte das gleiche Problem. Die Lösung erwies sich als viel einfacher. Es scheint, dass eine Datentabelle die Methode in Form eines Getters haben möchte, dh getSomeMethod (), nicht nur someMethod (). In meinem Fall in der Datentabelle habe ich findResults aufgerufen. Ich habe die Methode in meiner Backing Bean in getFindResults () geändert und es hat funktioniert.

Ein commandButton funktionierte find ohne das get, was es nur noch verwirrender machte.

user6627139
quelle
0

Was # 2 betrifft, so wurde es in meinem Fall nach dem Ersetzen auf magische Weise zum Leben erweckt

<body>

Tag mit

<h:body>

Nachdem ich mehrere (um ehrlich zu sein, einfachere) JSF-Projekte durchgeführt hatte, konnte ich mich nicht erinnern, jetzt etwas anderes eingerichtet zu haben, und ich bekam diese Art von Fehler zum ersten Mal. Ich habe eine sehr einfache Anmeldeseite erstellt (Benutzername, Passwort, Benutzer Bean ...) und alles wie gewohnt eingerichtet. Der einzige Unterschied, den ich entdeckt habe, sind die oben genannten Tags. Vielleicht findet das jemand nützlich.

Gishas
quelle
0

Das Problem in meinem Fall war, dass ich einen Konstruktor mit Parametern, aber keinen leeren Konstruktor in die Inject-Annotation aufgenommen habe.

@Inject public VisitorBean() {}

Ich habe es gerade ohne Konstruktor getestet und dies scheint auch zu funktionieren.

gregam3
quelle
0

Für 1. Thema ( Ziel nicht erreichbar, Bezeichner 'Bean' in Null aufgelöst );

Ich habe die wertvollen Antworten des @BalusC und der anderen Sharer überprüft, aber ich übertreffe dieses Problem in meinem Szenario wie folgt. Nach dem Erstellen eines neuen xhtml mit einem anderen Namen und dem Erstellen einer Bean-Klasse mit einem anderen Namen habe ich die Codes Schritt für Schritt in die neue Bean-Klasse und die neue xhtml-Datei geschrieben (nicht kopiert und eingefügt).

oguzhankinik
quelle
0

Wenn ich den Kontextparameter AnnotationConfigWebApplicationContext aus der Datei web.xml entferne, ist dies Arbeit

Wenn Sie wie param haben, was wie unten gezeigt, müssen Sie es aus der Datei web.xml entfernen

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 
Yasin
quelle
Möchten Sie herausfinden, warum dies das Problem löst? Oder warum verursacht es Probleme?
Kukeltje
-1

Arbeiten mit JSF im alten Stil Sie müssen die verwaltete Bean in der Datei bean -config.xml (im Ordner WEB-INF) definieren und in der Datei web.xml auf folgende Weise darauf verweisen :

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

(Ich habe versucht, andere Bereiche zu verwenden, aber ...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>
Pedro García Medina
quelle
-2

Ein weiterer Hinweis: Ich habe JSF verwendet und mvn-Abhängigkeiten hinzugefügt: com.sun.faces jsf-api 2.2.11

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

Dann habe ich versucht, zu Primefaces zu wechseln und die Primefaces-Abhängigkeit hinzuzufügen:

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

Ich habe mein xhtml von h: in p: geändert und xmlns: p = "http://primefaces.org/ui zur Vorlage hinzugefügt. Nur mit JSF lief das Projekt in Ordnung und die verwaltete Bean wurde in Ordnung erreicht. Wenn ich Primefaces hinzufüge Ich bekam das nicht erreichbare Objekt (javax.el.propertynotfoundexception). Das Problem war, dass JSF die ManagedBean generierte, nicht Primefaces, und ich fragte Primefaces nach dem Objekt. Ich musste jsf-impl aus meinem .pom löschen, clean und Installieren Sie das Projekt. Von diesem Punkt an ging alles in Ordnung. Ich hoffe, das hilft.

mluelmo
quelle
2
Ihre Annahme der Ursache des Problems macht keinen Sinn. PrimeFaces ist überhaupt keine JSF-Implementierung. Dies entspricht der Anforderung "Ihr Laufzeitklassenpfad ist sauber und frei von Duplikaten in CDI-API-bezogenen JARs." Mit anderen Worten, Ihr Laufzeitklassenpfad war in gewisser Weise mit doppelten Bibliotheken durcheinander und PrimeFaces vergrößerte ihn nur, verursachte ihn aber nicht.
BalusC
-3

EL interpretiert $ {bean.propretyName} wie beschrieben - der propertyName wird zu getPropertyName () unter der Annahme, dass Sie explizite oder implizite Methoden zum Generieren von Getter / Setter verwenden

Sie können dieses Verhalten überschreiben, indem Sie den Namen explizit als Funktion identifizieren: $ {bean.methodName ()} Dies ruft die Funktionsmethode Name () direkt ohne Änderung auf.

Es ist nicht immer wahr, dass Ihre Accessoren "get ..." heißen.

sdw
quelle
1
Dies ist nicht die richtige Vorgehensweise und macht es unmöglich, die richtigen Setter hinter den Eingabekomponenten aufzurufen. Dies kann auch nicht die Ursache für diese Ausnahme sein. Dies würde nur dazu führen , die die Ausnahme Sie den Fehler gemacht eine Eigenschaft in einer Aktionsmethode Ausdruck wie zu verweisen action="#{bean.property}"statt action="#{bean.method}".
BalusC
Bemerkenswerterweise ändert sich in der Welt des modernen Java mit funktionaler Programmierung diese "richtige Praxis". Siehe dev.to/scottshipp/… und die Referenzen, die. Beachten Sie, dass Lombok eine Einstellung für "fließend" hat, bei der get / set nicht hinzugefügt werden. Unser Unternehmen hat 1000 Ingenieure, die die aktuelle Praxis offenbar anders sehen.
SDW
1
Ich denke, Sie und Ihre 1000 Ingenieure verwechseln Eigenschaften mit Methoden.
BalusC
Diese Entwurfspraxis wird in großen Anwendungen mit sehr hoher Parallelität immer häufiger. Ich würde anbieten, dass Ihre Ablehnung auf einer Ansicht der Designrichtlinien basiert und nicht auf dem Wert der Antwort, um unserer großen Community dabei zu helfen, einen potenziellen Fehler aufzuspüren.
SDW
1
Huh? Entschuldigung, ich kann den Eindruck nicht ignorieren, dass Sie keine Ahnung haben, wovon Sie sprechen.
BalusC
-3

In meinem Fall fehlte "el-ri-1.0.jar".

Azhar Ak
quelle
1
Normalerweise brauchst du es überhaupt nicht, also gibt es noch etwas anderes. Höchstwahrscheinlich ein schmutziger Laufzeitklassenpfad. Sie sollten dies beheben, anstatt es langfristig noch schlimmer zu machen, indem Sie Bibliotheken hinzufügen, die bereits vom Server bereitgestellt werden sollen.
BalusC