IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

NullPointerException en spring.


Sujet :

Spring Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut NullPointerException en spring.
    Bonjour,
    Je reçois une exception NPE quand je redémarre tomcat. Je sais exactement quel object évalue à null (c'est une variable d'instance d'un objet de scope session) mais je ne sais pas pourquoi il n'est pas réinstancié par Spring et réinjecté dans l'objet de portée session.

    Voici le code dans la classe session-scoped SuggestionOeuvreView qui lance un NPE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        private Sculpture _suggererSculpture() {
            log.debug("_suggererSculpture");
            log.debug("Etat de la liste: " + this.sculpturesNonVisitees);
            if (!this.sculpturesNonVisitees.isEmpty() && this.sculpturesNonVisitees.peek() != null) {
                Integer idSculptureSuggeree = this.sculpturesNonVisitees.pollFirst();
                this.sculpturesNonVisitees.addLast(idSculptureSuggeree);
                log.debug("jbmService: " + jbmService);
                return jbmService.findByID(idSculptureSuggeree);//jbmService est null!!
            } else {
                log.error("Probleme dans _suggererSculpture");
                return null;//todo
            }
        }
    Voici le code concernant l'instanciation de la variable qui devient null. (toujours dans la même classe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private transient JbmService jbmService;
     
    @Autowired
        public SuggestionOeuvreView(JbmService jbmService) {
            log.debug("SuggestionOeuvreView()");
            this.jbmService = jbmService;
            this.sculpturesNonVisitees = recupererSculpturesNonVisitees();
        }
     
        @Autowired
        public void setJbmService(JbmService jbmService) {
            this.jbmService = jbmService;
        }

    Voici le code de la classe request-scoped AccueilView qui a comme variable d'instance la variable SuggestionOeuvreView.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     @Autowired
        @ScopedProxy
        public void setSuggestionOeuvreView(SuggestionOeuvreView suggestionOeuvreView) {
            log.debug("setSuggestionOeuvreView");
            this.suggestionOeuvreView = suggestionOeuvreView;
        }
    Pour info j'utilise JSF 1.2, Tomcat 6.0.18, Spring 2.5.5, Spring Java Config.

    Quelqu'un peut-il m'aider svp?

    Merci d'avance,

    Julien.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Peut-être
    Salut,

    Je ne sais pas si ca va régler tout tes problèmes mais essaye de placer l'annotation devant la propriété et pas devant les getters setters contructeurs

    Il faut t'assurer que le fichier de configuration spring soit bien écrit, donc si tu pouvais le placer dans ton prochain message on pourra peut-etre trouver quelque chose.

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse,
    J'ai déjà essayé de déplacer les annotation devant les propriétés et non devant les setters mais ça ne change rien. Voici le xml de configuration de spring. Note aussi que j'utilise javaconfig pour configurer les classes en question.
    Julien.

    p.s. désolé pour le "SOS" et merci de l'avoir enlevé.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Souvenirs souvenirs
    Salut,

    Si mes souvenirs sont bons je pense qu'il manque <context:annotation-config/> dans ta conf...

    Tiens moi au courant.

    PS : C'est quoi ton histoire de SOS ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Merci,
    J'ai essayé d'ajouter <context:annotation-config/> dans mon fichier de configuration mais cela ne donne rien. Note que tout fonctionne très bien mis à part le problème énoncé ci-dessus. Je voudrais juste qu'il réinstancie mon JbmService et il ne le fait pas...
    Julien.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par balteo Voir le message
    Merci,
    J'ai essayé d'ajouter <context:annotation-config/> dans mon fichier de configuration mais cela ne donne rien. Note que tout fonctionne très bien mis à part le problème énoncé ci-dessus. Je voudrais juste qu'il réinstancie mon JbmService et il ne le fait pas...
    Julien.
    possibilité :

    plusieurs instances de SuggestionOeuvreView coexistent et celle qui est utilisée n'est pas celle qui est "wired" par Spring…

    => tracez TOUS les constructeurs des classes incriminées pour éliminer cette possibilité.…

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Merci pour votre réponse JeitEmgie,

    Pouvez-vous me dire où chercher svp?
    -Les constructeurs de SuggestionOeuvreView? OU
    -Les constructeurs des classes qui ONT une instance de SuggestionOeuvreView en "wired"?

    Il est vrai que j'ai une instance de SuggestionOeuvreView dans deux classes et que je fais référence à celle-ci directement comme ceci dans mon jsf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #{suggestionOeuvreView.sculptureSuggeree.sculptureID}
    Ceci est il problématique? Dois-je qualifier mes variables ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #{accueilView.suggestionOeuvreView.sculptureSuggeree.sculptureID}
    ??
    Julien.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par balteo Voir le message
    Merci pour votre réponse JeitEmgie,

    Pouvez-vous me dire où chercher svp?
    -Les constructeurs de SuggestionOeuvreView? OU
    -Les constructeurs des classes qui ONT une instance de SuggestionOeuvreView en "wired"?
    les 2 seront utiles…
    mais en premier le 2ème cas…

    Citation Envoyé par balteo Voir le message
    Il est vrai que j'ai une instance de SuggestionOeuvreView dans deux classes et que je fais référence à celle-ci directement comme ceci dans mon jsf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #{suggestionOeuvreView.sculptureSuggeree.sculptureID}
    Ceci est il problématique? Dois-je qualifier mes variables ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #{accueilView.suggestionOeuvreView.sculptureSuggeree.sculptureID}
    ??
    Julien.
    c'est une bonne piste : si le JSF provoque l'allocation d'objets en dehors du cycle Spring ils ne seront sans doute pas "autowired"…

    et le debugging des constructeurs va vous le montrer tout de suite…

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Suite à votre dernier post,
    -J'ai essayé de qualifier la variable suggestionOeuvreView avec accueilView.
    -Je confirme que c'est bien le constructeur de AccueilView qui est appelé/invoqué.
    Malheureusement, j'ai exactement la même erreur càd un NPE....
    Julien.

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par balteo Voir le message
    Suite à votre dernier post,
    -Je confirme que c'est bien le constructeur de AccueilView qui est appelé/invoqué.
    combien de fois ?

    si le constructeur est appelé plus d'une fois : une des instances est sans doute celle qui génère la NPE : la variable d'instance n'est autowired que pour celle créée par Spring,

    si vous confirmez que c'est bien cela qui se passe, la solution est simple :

    il suffit d'utiliser le pattern singleton sur cette classe pour le résoudre…

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Effectivement j'avais pensé à cela et je viens de l'essayer.
    Quand je démarre Tomcat j'ai ceci:

    GRAVE: Exception lors de l'envoi de l'�v�nement contexte initialis� (context initialized) � l'instance de classe d'�coute (listener) org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accueilView': Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.jeanbaptistemartin.view.AccueilView.setSuggestionOeuvreView(com.jeanbaptistemartin.view.SuggestionOeuvreView); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'suggestionOeuvreView': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    effectivement si ce sont des "View" au sens MVC ça ne peut pas fonctionner avec un pattern singleton…

    j'avais en tête un problème similaire avec des WebServices et la couche "service" de l'application, auquel cas le pattern singleton fonctionnait très bien… d'où la tentation de réutiliser le même principe dans votre cas…

    mais maintenant que je vois mieux ce que sont vos classes "View" - à moins que je me trompe sur l'interprétation - je me demande si cela a un sens d'en faire des beans, êtes-vous certain de votre architecture ?
    J'imagine très bien les "Controller" en beans, mais les views…

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Mixage des scopes...
    Hello à nouveau,

    Désolé de t'avoir oublié un moment.
    J'ai lu toute la discussion et effectivement il me semble qu'il s'agisse d'un problème de mixage de scope comme l'évoque JeitEmgie.
    Ton objet SuggestionView est apparemment en scope session (vérifie le managed bean), or ton AcceuilView est apparemment en scope request !!!
    Lors de l'instanciation de l'AcceuilView, le SuggestionView wired en scope session est évidemment perdu ! Le wiring est donc impossible.

    Tiens moi au courant.

    Ciao ciao

Discussions similaires

  1. Spring mvc Test Controller NullPointerException
    Par sabfix dans le forum Spring
    Réponses: 0
    Dernier message: 10/09/2014, 09h55
  2. Réponses: 3
    Dernier message: 04/08/2014, 17h45
  3. java.lang.NullPointerException + jsf + spring
    Par Tlili2014 dans le forum Spring
    Réponses: 1
    Dernier message: 30/04/2014, 14h02
  4. Spring @autowired et NullPointerException
    Par velocity dans le forum Spring
    Réponses: 13
    Dernier message: 13/07/2012, 16h51
  5. Réponses: 2
    Dernier message: 16/01/2012, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo