2017-05-23 3 views
0

Alors que la mise à niveau de la version JSF d'une ancienne application web de MyFaces 1.1 à 2.2.12 MyFaces, je suis en train de remplacer les entrées <managed-bean> dans mon fichier faces-config.xml avec @ManagedBean annotations directement dans le haricot Des classes. J'utilise Migrating from JSF 1.2 to JSF 2.0 comme guide général pour la migration.Vous ne trouvez pas les haricots annotés avec @ManagedBean

Par exemple, je remplace quelque chose comme

<managed-bean> 
    <managed-bean-name>MyBean</managed-bean-name> 
    <managed-bean-class>some.package.MyBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

avec

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class MyBean { 

Selon Are there going to be two instances for a bean if I write @managed bean annotation and define same in faces-config.xml, les annotations sont remplacées par les entrées correspondantes dans le faces-config.xml, donc je supprimé l'élément <managed-bean> dans mon faces-config.xml .

Depuis que le projet se compose de plusieurs modules maven qui sont emballés comme des pots individuellement avant d'être déployés en tant que fichier de guerre combiné, j'ai essayé aussi de suivre les conseils de How does JSF find beans annotated with @ManagedBean? et a ajouté un autre dossier META-INF contenant un faces-config.xml à la sous-module contenant la fève , à l'adresse suivante (en respectant la réponse acceptée dans How to reference JSF managed beans which are provided in a JAR file?):

MainProject 
| SubModule 
|  |src 
|  | main 
|   | resources 
|    | META-INF 
|    | faces-config.xml 

avec le contenu suivant:

<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"> 
</faces-config> 

Malheureusement, je reçois toujours l'erreur suivante en essayant d'ouvrir la page qui utilise ce haricot spécifique:

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'MyBean' resolved to null 

Depuis que je suis en utilisant JSF pour la gestion des haricots, j'ai suivi la partie JSF des instructions Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable, mais même après vérifiant les points individuels mentionnés là-bas, j'ai toujours la même erreur. J'utilise Tomcat 7 comme conteneur de servlet, qui - selon http://tomcat.apache.org/whichversion.html - prend en charge la spécification de servlet jusqu'à la version 3.0, ce qui, à son tour, devrait suffire pour JSF 2.2, qui - si je comprends bien - nécessite au moins une spécification de servlet 2,5, selon http://myfaces.apache.org/core22/.

J'ai déjà beaucoup cherché pour la cause du problème (comme mentionné, j'ai essayé plusieurs des articles SO mentionnés ci-dessus), mais ne peut toujours pas résoudre le problème. Je serais très reconnaissant pour toute aide!

+1

Petite suggestion: Avec JSF 2.3, l'annotation '@ ManagedBean' est déconseillée en faveur de l'utilisation du CDI' @ Named'. Ce ne serait pas le bon moment pour passer directement à cela au lieu de @ManagedBean? – Kukeltje

+0

@Kukeltje Merci pour la suggestion. J'ai considéré la mise à niveau vers CDI et l'annotation '@ Named ', mais j'ai rencontré beaucoup d'autres problèmes. Mais peut-être avez-vous raison et je devrais essayer de résoudre ces problèmes au lieu d'obtenir quelque chose à travailler qui sera bientôt obsolète. – scholt

Répondre

0

La réponse se trouve dans le @ManagedBean Javadoc:

The value of the ManagedBean.name attribute is taken to be the managed-bean-name . If the value of the name attribute is unspecified or is the empty String , the managed-bean-name is derived from taking the unqualified class name portion of the fully qualified class name and converting the first character to lower case. For example, if the ManagedBean annotation is on a class with the fully qualified class name com.foo.Bean , and there is no name attribute on the annotation, the managed-bean-name is taken to be bean . The fully qualified class name of the class to which this annotation is attached is taken to be the managed-bean-class .

Ainsi, votre haricot est nommé myBean et non MyBean. Si vous voulez que ce soit MyBean, indiquez le nom avec l'annotation: @ManagedBean(name = "MyBean").

+0

Merci beaucoup pour votre réponse!Malheureusement, j'ai déjà essayé de résoudre le problème de cette façon en définissant le nom avec '(name =" MyBean ")' (et je l'ai juste essayé à nouveau), mais j'ai toujours la même erreur: 'javax.el.PropertyNotFoundException: Cible inaccessible , identifiant 'MyBean' résolu à null' – scholt

+0

Je deviens fou ici. J'ai essayé de mettre le dossier META-INF et le 'faces-config.xml' contenu dans chaque emplacement imaginable, mais l'erreur reste la même. – scholt