Identifier et résoudre javax.el.PropertyNotFoundException: Target Unreachable


127

Lorsque vous essayez de référencer un bean géré dans EL comme cela #{bean.entity.property}, une javax.el.PropertyNotFoundException: Target Unreachableexception est parfois levée, généralement lorsqu'une propriété de bean doit être définie ou lorsqu'une action de bean doit être appelée.

Il semble y avoir cinq types de messages différents:

  1. Cible inaccessible, identifiant 'bean' résolu à null
  2. Cible inaccessible, «entité» a renvoyé null
  3. Cible inaccessible, 'null' a renvoyé null
  4. Cible inaccessible, «0» a renvoyé null
  5. Cible inaccessible, 'BracketSuffix' a renvoyé null

Que signifient-elles? Comment sont-ils causés et comment devraient-ils être résolus?




Tout d'un coup, cela s'est cassé pour moi ... J'ai corrigé ce problème (il ne reconnaissait pas mon bean) en arrêtant le serveur, en supprimant javax.faces.jar (Mojarra), en supprimant mon répertoire de construction et en nettoyant le \ tmp \ de mon serveur WebLogic et \ cache \ dossiers dans le domaine, redémarrage du serveur, tentative de publication et échec car il ne trouve pas javax, annulation de la suppression de javax.faces.jar par SVN (vous pouvez donc simplement le déplacer, puis le remettre en place) et la publication. Tout d'un coup, cela a fonctionné à nouveau ...
Andrew

Vérifiez toujours quelques lignes ci-dessus pour les messages de journal pertinents qui se sont produits lors du déploiement, ici c'était la cause principale réelle: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]Et cela dit que bean ( FinancialAdminReceiptWebRequestBean) n'a pas pu être trouvé et résolu à nullcoup sûr. Une autre erreur courante est de ne pas redémarrer le serveur d'applications après par exemple avoir renommé ou déplacé des classes / interfaces (ou oublié clean).
Roland le

Réponses:


238

1. Cible inaccessible, identificateur «bean» résolu à null

Cela revient à dire que l'instance de bean géré elle-même n'a pas pu être trouvée exactement par cet identifiant (nom de bean géré) dans EL comme ça #{bean}.

L'identification de la cause peut être décomposée en trois étapes:

une. Qui gère le haricot?
b. Quel est le nom du bean géré (par défaut)?
c. Où est la classe de backing bean?

1a. Qui gère le haricot?

La première étape serait de vérifier quel cadre de gestion de bean est responsable de la gestion de l'instance de bean. Est-ce JSF via @ManagedBean? Ou est-ce CDI via @Named? Ou est-ce le printemps via @Component? Pouvez-vous vous assurer que vous ne mélangez pas plusieurs annotations spécifiques au framework de gestion de bean sur la même classe de bean de support? Par exemple @Named @Component, ou @Named @ManagedBean, ou @ManagedBean @Component. C'est faux. Le bean doit être géré par au plus un framework de gestion de bean et ce framework doit être correctement configuré. Si vous ne savez déjà pas lequel choisir, dirigez-vous vers Backing beans (@ManagedBean) ou CDI Beans (@Named)? et intégration Spring JSF: comment injecter un composant / service Spring dans un bean géré JSF?

Dans le cas où c'est JSF qui gère le bean via @ManagedBean, vous devez vous assurer de ce qui suit:

  • La faces-config.xmldéclaration racine est compatible avec JSF 2.0. Ainsi, le fichier XSD et le versiondoivent au moins spécifier JSF 2.0 ou supérieur et donc pas 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">

    Pour JSF 2.1, remplacez simplement 2_0et 2.0par 2_1et 2.1respectivement.

    Si vous êtes sur JSF 2.2 ou supérieur, assurez-vous que vous utilisez des xmlns.jcp.orgespaces de noms au lieu de java.sun.compartout.

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

    Pour JSF 2.3, remplacez simplement 2_2et 2.2par 2_3et 2.3respectivement.

  • Vous n'avez pas importé accidentellement à la javax.annotation.ManagedBeanplace de javax.faces.bean.ManagedBean. Attention à la saisie semi-automatique de l'IDE, Eclipse est connu pour suggérer automatiquement le mauvais en tant que premier élément de la liste.

  • Vous n'avez pas remplacé le @ManagedBeanpar une <managed-bean>entrée de style JSF 1.x dans faces-config.xmlla même classe de bean de support avec un nom de bean géré différent. Celui-ci aura préséance sur @ManagedBean. L'enregistrement d'un bean géré dans faces-config.xmln'est pas nécessaire depuis JSF 2.0, il suffit de le supprimer.
  • Votre chemin de classe d'exécution est propre et exempt de doublons dans les fichiers JAR liés à l'API JSF. Assurez-vous de ne pas mélanger plusieurs implémentations JSF (Mojarra et MyFaces). Assurez-vous de ne pas fournir un autre fichier JAR JSF ou même Java EE API le long de l'application Web lorsque le conteneur cible regroupe déjà l'API JSF. Voir aussi la section «Installation de JSF» de notre page wiki JSF pour les instructions d'installation de JSF. Dans le cas où vous avez l'intention de mettre à niveau JSF groupé avec le conteneur à partir du WAR au lieu du conteneur lui-même, assurez-vous que vous avez demandé au conteneur cible d'utiliser l'API JSF / impl.
  • Si vous empaquetez des beans gérés JSF dans un JAR, assurez-vous que le JAR a au moins une compatibilité JSF 2.0 /META-INF/faces-config.xml. Voir aussi Comment référencer les beans gérés JSF qui sont fournis dans un fichier JAR?
  • Si vous utilisez réellement le jurassic JSF 1.x et que vous ne pouvez pas mettre à niveau, vous devez enregistrer le bean via <managed-bean>au faces-config.xmllieu de @ManagedBean. N'oubliez pas de corriger le chemin de construction de votre projet de manière à ne plus avoir de bibliothèques JSF 2.x (afin que l' @ManagedBeanannotation ne soit pas compilée avec succès).


Dans le cas où c'est CDI qui gère le bean via @Named, vous devez vous assurer de ce qui suit:

  • CDI 1.0 (Java EE 6) nécessite un /WEB-INF/beans.xmlfichier pour activer CDI dans WAR. Il peut être vide ou contenir uniquement le contenu suivant:

    <?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) sans aucun beans.xml, ou un beans.xmlfichier vide , ou avec la compatibilité CDI 1.0 ci-dessus beans.xmlse comportera de la même manière que CDI 1.0. Quand il y a un CDI 1.1 compatible beans.xmlavec un explicite version="1.1", il sera par défaut uniquement enregistrer les @Namedharicots avec une annotation portée explicite de CDI tels que @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScoped, etc. Si vous avez l' intention d'enregistrer tous les haricots comme CDI a réussi les haricots, même sans explicite Portée CDI, utilisez le CDI 1.1 ci-dessous compatible /WEB-INF/beans.xmlavec bean-discovery-mode="all"set (la valeur par défaut est 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>
  • Lorsque vous utilisez CDI 1.1+ avec bean-discovery-mode="annotated"(par défaut), assurez-vous que vous n'avez pas importé accidentellement une portée JSF telle que la javax.faces.bean.RequestScopedplace d'une portée CDI javax.enterprise.context.RequestScoped. Attention à la saisie semi-automatique IDE.

  • Lorsque vous utilisez Mojarra 2.3.0-2.3.2 et CDI 1.1+ avec bean-discovery-mode="annotated"(par défaut), vous devez mettre à niveau Mojarra vers 2.3.3 ou plus récent en raison d'un bogue . Si vous ne pouvez pas mettre à niveau, vous devez soit ensemble bean-discovery-mode="all"dans beans.xml, ou de mettre le JSF 2.3 spécifique @FacesConfigannotation sur une classe arbitraire dans la guerre ( en général une sorte d'une application scope classe démarrage).
  • Les conteneurs non-Java EE tels que Tomcat et Jetty ne sont pas livrés avec CDI. Vous devez l'installer manuellement. C'est un peu plus de travail que d'ajouter simplement le (s) JAR (s) de la bibliothèque. Pour Tomcat, assurez-vous de suivre les instructions de cette réponse: Comment installer et utiliser CDI sur Tomcat?
  • Votre chemin de classe d'exécution est propre et exempt de doublons dans les fichiers JAR liés à l'API CDI. Assurez-vous de ne pas mélanger plusieurs implémentations CDI (Weld, OpenWebBeans, etc.). Assurez-vous de ne pas fournir un autre fichier CDI ou même un fichier JAR API Java EE avec l'application Web lorsque le conteneur cible regroupe déjà l'API CDI.
  • Si vous empaquetez des beans gérés par CDI pour des vues JSF dans un JAR, assurez-vous que le JAR a au moins un fichier valide /META-INF/beans.xml(qui peut être laissé vide).


Si c'est Spring qui gère le bean via @Component, vous devez vous assurer des éléments suivants:

  • Spring est en cours d'installation et d'intégration conformément à sa documentation . Surtout, vous devez au moins avoir ceci dans web.xml:

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

    Et ceci dans faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (ci-dessus est tout ce que je sais en ce qui concerne Spring - je ne fais pas Spring - n'hésitez pas à modifier / commenter d'autres causes probables liées à Spring; par exemple, des problèmes liés à la configuration XML)


Dans le cas où il est un composant répéteur qui gère les ressources (imbriqués) bean via son varattribut (par exemple <h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">, etc.) et vous avez réellement obtenu une « cible Inaccessible, identifiant « item » résolu null », alors vous devez vous assurer de ce qui suit :

  • Le #{item}n'est référencé dans l' bindingattribut d'aucun composant enfant. Ceci est incorrect car l' bindingattribut s'exécute pendant la génération de la vue, et non pendant le rendu de la vue. De plus, il n'y a physiquement qu'un seul composant dans l'arborescence des composants qui est simplement réutilisé à chaque tour d'itération. En d'autres termes, vous devriez en fait utiliser à la binding="#{bean.component}"place de binding="#{item.component}". Mais il est préférable de se débarrasser complètement de la combinaison des composants et de rechercher / demander la bonne approche pour le problème que vous pensiez résoudre de cette manière. Voir aussi Comment l'attribut 'binding' fonctionne-t-il dans JSF? Quand et comment doit-il être utilisé?


1b. Quel est le nom du bean géré (par défaut)?

La deuxième étape consisterait à vérifier le nom du bean géré enregistré. JSF et Spring utilisent les conventions conformes à la spécification JavaBeans tandis que CDI a des exceptions en fonction de l'impl / version de CDI.

  • Une FooBeanclasse de backing bean comme ci-dessous,

    @Named
    public class FooBean {}

    aura dans tous les frameworks de gestion de bean un nom de bean géré par défaut #{fooBean}, selon la spécification JavaBeans.

  • Une FOOBeanclasse de backing bean comme ci-dessous,

    @Named
    public class FOOBean {}

    dont le nom de classe non qualifié commence par au moins deux majuscules aura dans JSF et Spring un nom de bean géré par défaut exactement le nom de classe non qualifié #{FOOBean}, également conforme à la spécification JavaBeans. En CDI, c'est également le cas dans les versions Weld publiées avant juin 2015, mais pas dans les versions Weld publiées après juin 2015 (2.2.14 / 2.3.0.B1 / 3.0.0.A9) ni dans OpenWebBeans en raison d' un Spéc . CDI . Dans ces versions de Weld et dans toutes les versions OWB, c'est uniquement avec le premier caractère en minuscule #{fOOBean}.

  • Si vous avez explicitement spécifié un nom de bean géré foocomme ci-dessous,

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

    ou de manière équivalente avec @ManagedBean(name="foo")ou @Component("foo"), alors il ne sera disponible que par #{foo}et donc pas par #{fooBean}.


1c. Où est la classe de backing bean?

La troisième étape consisterait à vérifier si la classe du bean de support est au bon endroit dans le fichier WAR construit et déployé. Assurez-vous que vous avez correctement effectué un nettoyage complet, une reconstruction, un redéploiement et un redémarrage du projet et du serveur au cas où vous seriez réellement occupé à écrire du code et à appuyer avec impatience sur F5 dans le navigateur. Si toujours en vain, laissez le système de construction produire un fichier WAR, que vous extrayez et inspectez ensuite avec un outil ZIP. Le .classfichier compilé de la classe du bean de sauvegarde doit résider dans sa structure de package dans /WEB-INF/classes. Ou, lorsqu'il est empaqueté dans le cadre d'un module JAR, le JAR contenant le .classfichier compilé doit résider dans /WEB-INF/libet donc pas par exemple EAR /libou ailleurs.

Si vous utilisez Eclipse, assurez-vous que la classe de bean de support est dans srcet donc pas WebContent , et assurez-vous que Projet> Construire automatiquement est activé. Si vous utilisez Maven, assurez-vous que la classe de backing bean est dans src/main/javaet donc pas dans src/main/resourcesou src/main/webapp.

Si vous empaquetez l'application Web dans le cadre d'un EAR avec EJB + WAR (s), vous devez vous assurer que les classes de backing bean sont dans le module WAR et donc pas dans le module EAR ni dans le module EJB. Le niveau métier (EJB) doit être exempt d'artefacts liés au niveau Web (WAR), afin que le niveau métier soit réutilisable sur plusieurs niveaux Web différents (JSF, JAX-RS, JSP / Servlet, etc.).


2. Cible inaccessible, "entité" a renvoyé la valeur null

Cela revient à ce que la imbriquée propriété entitycomme dans #{bean.entity.property}retour null. Cela n'expose généralement que lorsque JSF doit définir la valeur de propertyvia un composant d'entrée comme ci-dessous, alors que le #{bean.entity}fichier est effectivement retourné null.

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

Vous devez vous assurer que vous avez préparé l'entité de modèle au préalable dans une @PostConstruct, ou une <f:viewAction>méthode, ou peut-être une add()méthode d'action au cas où vous travaillez avec des listes CRUD et / ou des boîtes de dialogue sur la même vue.

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

    // ...
}

Quant à l'importance de @PostConstruct; faire cela dans un constructeur normal échouerait si vous utilisez un cadre de gestion de bean qui utilise des proxies , tels que CDI. Toujours utiliser @PostConstructpour accrocher l'initialisation d'instance de bean géré (et utiliser @PreDestroypour accrocher la destruction d'instance de bean géré). De plus, dans un constructeur, vous n'auriez pas encore accès à des dépendances injectées, voir aussi NullPointerException en essayant d'accéder au bean @Inject dans le constructeur .

Si le entityIdest fourni via <f:viewParam>, vous devez utiliser à la <f:viewAction>place de @PostConstruct. Voir aussi Quand utiliser f: viewAction / preRenderView par rapport à PostConstruct?

Vous devez également vous assurer de conserver le non- nullmodèle pendant les publications au cas où vous le créeriez uniquement dans une add()méthode d'action. Le plus simple serait de placer le bean dans l'étendue de la vue. Voir aussi Comment choisir la bonne portée de haricot?


3. Cible inaccessible, 'null' a renvoyé null

Cela a en fait la même cause que # 2, seule l'implémentation EL (plus ancienne) utilisée est quelque peu boguée en préservant le nom de la propriété à afficher dans le message d'exception, qui est finalement incorrectement exposé comme «null». Cela ne rend le débogage et la correction un peu plus difficiles que lorsque vous avez assez de propriétés imbriquées comme ça #{bean.entity.subentity.subsubentity.property}.

La solution est toujours la même: assurez-vous que l'entité imbriquée en question ne l'est pas null, à tous les niveaux.


4. Cible inaccessible, «0» a renvoyé null

Cela a également la même cause que # 2, seule l'implémentation EL (plus ancienne) utilisée est boguée dans la formulation du message d'exception. Cela expose uniquement lorsque vous utilisez la notation entre accolades []dans EL comme dans #{bean.collection[index]}lequel le #{bean.collection}lui-même est non nul, mais l'élément à l'index spécifié n'existe pas. Un tel message doit alors être interprété comme:

Cible inaccessible, 'collection [0]' a renvoyé null

La solution est également la même que la n ° 2: assurez-vous que l'élément de collection est disponible.


5. Cible inaccessible, "BracketSuffix" a renvoyé null

Cela a en fait la même cause que le n ° 4, seule l'implémentation EL (plus ancienne) utilisée est quelque peu boguée dans la préservation de l'index d'itération à afficher dans le message d'exception, qui est finalement incorrectement exposé en tant que `` BracketSuffix '' qui est vraiment le caractère ]. Cela ne rend le débogage et la correction un peu plus difficiles que lorsque vous avez plusieurs éléments dans la collection.


Autres causes possibles de javax.el.PropertyNotFoundException:


Je suis en train de tomber sur le numéro 3. #{bean.entity.property}affiche la valeur mais <p:selectBooleanCheckbox value="#{bean.entity.property}"/>échoue. Mon booléen a un setter. Une propriété entière sur la même entité ne fonctionne pas dans un champ d'entrée. Des idées?
Jasper de Vries

Une autre chose à vérifier est de vous assurer que vos implémentations JSF et CDI s'intègrent, ce qui était mon problème: stackoverflow.com/questions/44064995/...
Jerry B. n ° 1 stagiaire

Selon:: Target Unreachable, identifier 'bean' resolved to nullDans les projets maven multi-modules (contenant des modules pour ejb, web, ear), assurez-vous que votre module web déclare une dépendance à votre module ejb. Sans cela, les @ManagedBeanne peuvent pas être résolus à l'aide de JSF2.0 et vous devez les déclarer dans faces-config.xml. Il m'a fallu environ deux heures en remarquant que je n'avais pas déclaré de dépendance pour inclure l'ejb dans mon module Web (je n'avais que ejb et web dans l'oreille)
bish

1
@bish Les artefacts frontaux tels que les @ManagedBeanclasses n'appartiennent pas à la couche de service (projet EJB) en premier lieu. Voir aussi stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Un bean non sérialisable pourrait-il également entraîner cette erreur (comme je suppose que c'est le cas dans stackoverflow.com/questions/47533584/… (mais je ne peux pas essayer moi-même actuellement))
Kukeltje

6

Pour ceux qui sont encore coincés ...

En utilisant NetBeans 8.1 et GlassFish 4.1 avec CDI, pour une raison quelconque, j'ai eu ce problème uniquement localement, pas sur le serveur distant. Qu'est-ce que le truc:

-> en utilisant javaee-web-api 7.0 au lieu de la version pom par défaut fournie par NetBeans, qui est javaee-web-api 6.0, donc:

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

-> téléchargez ce javaee-web-api-7.0.jar en tant que lib sur le serveur (dossier lib dans le dossier domain1) et redémarrez le serveur.


Cela correspond à "Votre chemin de classe d'exécution est propre et exempt de doublons dans les fichiers JAR liés à l'API CDI." En d'autres termes, votre chemin de classe d'exécution était en quelque sorte gâché avec des bibliothèques en double.
BalusC

En effet, et votre réponse m'a aidé à identifier le problème probable sur lequel je devrais me concentrer ;-) Juste en prouvant ici les détails de ma solution spécifique, cela pourrait faire gagner du temps à quelques utilisateurs.
seinecle

1

J'ai décidé de partager ma découverte sur cette erreur après l'avoir résolue moi-même.

Tout d'abord, les solutions BalusC doivent être prises au sérieux, mais il y a un autre problème probable dans Netbeans dont il faut être conscient, en particulier lors de la création d'un projet d'application d'entreprise (EAR) à l' aide de Maven.

Netbeans génère, un fichier POM parent , un projet EAR , un projet EJB et un projet WAR . Tout le reste de mon projet allait bien, et j'ai presque supposé que le problème était probablement un bogue dans GlassFish 4.0 (j'ai dû l'installer et le brancher sur Netbeans) parce que GlassFish 4.1 a un bogue Weld CDI qui rend le GlassFish 4.1 intégré dans Netbeans 8.0. 2 inutilisable sauf à travers un patch.

Solution:

Pour résoudre le « cible Inaccessible, identifiant « haricot » a décidé de null » ERROR-

I Cliquez avec le bouton droit sur le projet POM parent et sélectionnez Propriétés . Une boîte de dialogue Propriétés du projet apparaît, cliquez sur "Sources", vous serez surpris de voir le " Format Source / Binaire » défini sur 1,5 et « Encodage » sur Windows 1250. Changez le « Format source / binaire » en 1,6 0r 1,7, selon la valeur vous préférez rendre votre projet compatible CDI, et " Encoding " en UTF-8.

Faites de même pour tous les autres sous-projets (EAR, EJB, WAR) s'ils ne sont pas déjà compartimentables. Exécutez votre projet et vous n'obtiendrez plus cette erreur.

J'espère que cela aide quelqu'un à avoir une erreur similaire.


Je trouve votre réponse difficile à comprendre en général (à beaucoup d'informations non directement liées) et aussi que le format source / binaire et l'encodage jouent un rôle dans ce problème. Êtes-vous sûr que changer cela n'a pas seulement déclenché une bonne reconstruction complète qui a résolu le problème?
Kukeltje

1

J'ai décidé de partager ma solution, car bien que de nombreuses réponses fournies ici aient été utiles, j'avais toujours ce problème. Dans mon cas, j'utilise JSF 2.3, jdk10, jee8, cdi 2.0 pour mon nouveau projet et j'ai exécuté mon application sur wildfly 12, en démarrant le serveur avec le paramètre standalone.sh -Dee8.preview.mode = true comme recommandé sur le site wildfly . Le problème avec "bean résolu à null" a disparu après le téléchargement de wildfly 13. Le téléchargement exactement de la même guerre sur wildfly 13 a tout fait fonctionner.


1

Je suis resté coincé sur cette erreur parce que dans la classe qui a le @SpringBootApplication j'ai oublié de spécifier le nom du package du contrôleur.

Je voulais être plus précis cette fois en indiquant quels composants Spring devait analyser, au lieu de configurer le package de base.

C'était comme ça:

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

Mais la forme correcte est l'une de celles-ci:

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

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

J'ai décidé de partager ma solution, car bien que la bonne réponse soit très complète, elle ne couvre pas cette erreur (idiote) :)


0

Dans mon cas, j'ai commis une erreur d'orthographe dans @Named ("beanName"), c'était supposé être "beanName", mais j'ai écrit "beanNam", par exemple.


0

J'utilise wildfly 10 pour le conteneur javaee. J'avais rencontré un problème "Target Unreachable, 'entity' returned null". Merci pour les suggestions de BalusC, mais mon problème sur les solutions expliqué. Utilisation accidentelle de "import com.sun.istack.logging.Logger;" au lieu de "import org.jboss.logging.Logger;" causé CDI implémenté JSF EL. J'espère que cela aidera à améliorer la solution.


0

J'ai eu le même problème. La solution s'est avérée beaucoup plus simple. Il semble qu'un datatable veut la méthode sous la forme d'un getter, c'est-à-dire getSomeMethod (), pas seulement someMethod (). Dans mon cas, dans le datatable, j'appelais findResults. J'ai changé la méthode de mon bean de sauvegarde en getFindResults () et cela a fonctionné.

Un commandButton fonctionnait pour trouver sans le get, ce qui ne faisait que rendre les choses encore plus déroutantes.


0

Quant au n ° 2, dans mon cas, il a pris vie par magie après le remplacement

<body>

taguer avec

<h:body>

Après avoir réalisé plusieurs projets JSF (plus simples, pour être honnêtes), je ne me souvenais pas d'avoir fait quoi que ce soit de différent en le configurant maintenant, et j'ai eu ce genre d'erreur pour la première fois. Je faisais une page de connexion très basique (nom d'utilisateur, mot de passe, utilisateur Bean ...) et configurais tout comme d'habitude. La seule différence que j'ai repérée concerne les balises susmentionnées. Peut-être que quelqu'un trouve cela utile.


0

Le problème dans mon cas était que j'incluais un constructeur prenant des paramètres mais pas un constructeur vide avec l'annotation Inject, comme ceci.

@Inject public VisitorBean() {}

Je viens de le tester sans aucun constructeur et cela semble fonctionner aussi.


0

Pour 1. topic ( Target Unreachable, identifiant 'bean' résolu en null );

J'ai vérifié les réponses précieuses du @BalusC et des autres partageurs, mais je dépasse le problème comme celui-ci sur mon scénario. Après avoir créé un nouveau xhtml avec un nom différent et créé une classe de bean avec un nom différent, j'ai écrit (pas copier-coller) les codes étape par étape vers la nouvelle classe de bean et le nouveau fichier xhtml.


0

Lorsque je supprime le paramètre de contexte AnnotationConfigWebApplicationContext du fichier web.xml C'est du travail

Si vous avez un paramètre similaire, comme indiqué ci-dessous, vous devez le supprimer du fichier web.xml

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

soin d'élaborer pourquoi cela résout le problème? Ou plutôt pourquoi l'avoir cause des problèmes?
Kukeltje le

-1

Travailler avec JSF dans l'ancien style Vous devez définir le bean géré dans le fichier beans-config.xml (situé dans le dossier WEB-INF) et y faire référence dans le fichier web.xml fichier , de cette façon:

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>

(J'ai essayé d'utiliser d'autres oscilloscopes, mais ...)

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 autre indice: j'utilisais JSF, et j'ai ajouté des dépendances 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>

Ensuite, j'ai essayé de passer à Primefaces et d'ajouter une dépendance primefaces:

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

J'ai changé mon xhtml de h: à p :, en ajoutant xmlns: p = "http://primefaces.org/ui au modèle. Seulement avec JSF, le projet fonctionnait bien, et le managedbean était bien atteint. Quand j'ai ajouté Primefaces J'obtenais l'objet inaccessible (javax.el.propertynotfoundexception). Le problème était que JSF générait le ManagedBean, pas Primefaces, et je demandais l'objet à primefaces. J'ai dû supprimer jsf-impl de mon .pom, nettoyer et installer le projet. Tout s'est bien passé à partir de ce point. J'espère que cela vous aidera.


2
Votre hypothèse sur la cause du problème n'a pas de sens. PrimeFaces n'est pas du tout une implémentation JSF. Cela correspond à l'exigence «Votre chemin de classe d'exécution est propre et exempt de doublons dans les fichiers JAR liés à l'API CDI». En d'autres termes, votre chemin de classe d'exécution était en quelque sorte gâché avec des bibliothèques en double et PrimeFaces ne faisait que l'agrandir, pas le provoquer.
BalusC

-3

EL interprète $ {bean.propretyName} comme décrit - le propertyName devient getPropertyName () en supposant que vous utilisez des méthodes explicites ou implicites de génération de getter / setters

Vous pouvez remplacer ce comportement en identifiant explicitement le nom en tant que fonction: $ {bean.methodName ()} Ceci appelle la méthode de fonction Name () directement sans modification.

Il n'est pas toujours vrai que vos accesseurs s'appellent "get ...".


1
Ce n'est pas la bonne pratique et cela rend impossible l'invocation des bons paramètres derrière les composants d'entrée. Cela ne peut pas non plus être la cause de ladite exception. Cela entraînerait seulement ladite exception, vous avez fait l'erreur de référencer une propriété dans une expression de méthode d'action telle que action="#{bean.property}"au lieu de action="#{bean.method}".
BalusC

remarquablement, dans le monde du java moderne avec la programmation fonctionnelle, cette «pratique correcte» est en train de changer. Voir dev.to/scottshipp/… et les références qui. Notez que Lombok a un paramètre pour "fluent" où get / set ne sont pas ajoutés. Notre entreprise compte 1000 ingénieurs qui semblent avoir une vision différente de la pratique actuelle.
sdw

1
Je pense que vous et vos 1000 ingénieurs confondez propriétés et méthodes.
BalusC

Cette pratique de conception devient courante dans les applications à grande échelle avec une concurrence très élevée. Je proposerais que votre vote négatif soit basé sur une vue des directives de conception, plutôt que sur la valeur de la réponse pour aider notre vaste communauté à détecter un bogue potentiel.
sdw

1
Hein? Désolé, je ne peux ignorer l'impression que vous n'avez aucune idée de ce dont vous parlez.
BalusC

-3

Dans mon cas, "el-ri-1.0.jar" manquait.


1
Normalement, vous n'en avez pas du tout besoin, il y a donc autre chose en jeu. Très probablement un chemin de classe d'exécution sale. Vous devriez corriger cela au lieu de l'aggraver à long terme en ajoutant des bibliothèques qui sont censées être déjà fournies par le serveur.
BalusC
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.