Lorsque vous essayez de référencer un bean géré dans EL comme cela #{bean.entity.property}
, une javax.el.PropertyNotFoundException: Target Unreachable
exception 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:
- Cible inaccessible, identifiant 'bean' résolu à null
- Cible inaccessible, «entité» a renvoyé null
- Cible inaccessible, 'null' a renvoyé null
- Cible inaccessible, «0» a renvoyé null
- Cible inaccessible, 'BracketSuffix' a renvoyé null
Que signifient-elles? Comment sont-ils causés et comment devraient-ils être résolus?
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 ànull
coup 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
).Réponses:
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.xml
déclaration racine est compatible avec JSF 2.0. Ainsi, le fichier XSD et leversion
doivent au moins spécifier JSF 2.0 ou supérieur et donc pas 1.x.Pour JSF 2.1, remplacez simplement
2_0
et2.0
par2_1
et2.1
respectivement.Si vous êtes sur JSF 2.2 ou supérieur, assurez-vous que vous utilisez des
xmlns.jcp.org
espaces de noms au lieu dejava.sun.com
partout.Pour JSF 2.3, remplacez simplement
2_2
et2.2
par2_3
et2.3
respectivement.Vous n'avez pas importé accidentellement à la
javax.annotation.ManagedBean
place dejavax.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.@ManagedBean
par une<managed-bean>
entrée de style JSF 1.x dansfaces-config.xml
la 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é dansfaces-config.xml
n'est pas nécessaire depuis JSF 2.0, il suffit de le supprimer./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>
aufaces-config.xml
lieu 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'@ManagedBean
annotation 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.xml
fichier pour activer CDI dans WAR. Il peut être vide ou contenir uniquement le contenu suivant:CDI 1.1 (Java EE 7) sans aucun
beans.xml
, ou unbeans.xml
fichier vide , ou avec la compatibilité CDI 1.0 ci-dessusbeans.xml
se comportera de la même manière que CDI 1.0. Quand il y a un CDI 1.1 compatiblebeans.xml
avec un expliciteversion="1.1"
, il sera par défaut uniquement enregistrer les@Named
haricots 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.xml
avecbean-discovery-mode="all"
set (la valeur par défaut estbean-discovery-mode="annotated"
).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 lajavax.faces.bean.RequestScoped
place d'une portée CDIjavax.enterprise.context.RequestScoped
. Attention à la saisie semi-automatique IDE.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 ensemblebean-discovery-mode="all"
dansbeans.xml
, ou de mettre le JSF 2.3 spécifique@FacesConfig
annotation sur une classe arbitraire dans la guerre ( en général une sorte d'une application scope classe démarrage).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
:Et ceci dans
faces-config.xml
:(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
var
attribut (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'binding
attribut d'aucun composant enfant. Ceci est incorrect car l'binding
attribut 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 à labinding="#{bean.component}"
place debinding="#{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
FooBean
classe de backing bean comme ci-dessous,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
FOOBean
classe de backing bean comme ci-dessous,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é
foo
comme ci-dessous,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
.class
fichier 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.class
fichier compilé doit résider dans/WEB-INF/lib
et donc pas par exemple EAR/lib
ou ailleurs.Si vous utilisez Eclipse, assurez-vous que la classe de bean de support est dans
src
et donc pasWebContent
, et assurez-vous que Projet> Construire automatiquement est activé. Si vous utilisez Maven, assurez-vous que la classe de backing bean est danssrc/main/java
et donc pas danssrc/main/resources
ousrc/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é
entity
comme dans#{bean.entity.property}
retournull
. Cela n'expose généralement que lorsque JSF doit définir la valeur deproperty
via un composant d'entrée comme ci-dessous, alors que le#{bean.entity}
fichier est effectivement retournénull
.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 uneadd()
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.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@PostConstruct
pour accrocher l'initialisation d'instance de bean géré (et utiliser@PreDestroy
pour 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
entityId
est 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-
null
modèle pendant les publications au cas où vous le créeriez uniquement dans uneadd()
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: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
:la source
#{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?Target Unreachable, identifier 'bean' resolved to null
Dans 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@ManagedBean
ne peuvent pas être résolus à l'aide de JSF2.0 et vous devez les déclarer dansfaces-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)@ManagedBean
classes n'appartiennent pas à la couche de service (projet EJB) en premier lieu. Voir aussi stackoverflow.com/questions/13011392/jsf-service-layerPour 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:
-> 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.
la source
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.
la source
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.
la source
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) :)
la source
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.
la source
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.
la source
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.
la source
Quant au n ° 2, dans mon cas, il a pris vie par magie après le remplacement
taguer avec
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.
la source
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.
Je viens de le tester sans aucun constructeur et cela semble fonctionner aussi.
la source
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.
la source
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
la source
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
(J'ai essayé d'utiliser d'autres oscilloscopes, mais ...)
web.xml
la source
Un autre indice: j'utilisais JSF, et j'ai ajouté des dépendances mvn: com.sun.faces jsf-api 2.2.11
Ensuite, j'ai essayé de passer à Primefaces et d'ajouter une dépendance primefaces:
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.
la source
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 ...".
la source
action="#{bean.property}"
au lieu deaction="#{bean.method}"
.Dans mon cas, "el-ri-1.0.jar" manquait.
la source