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 :

Injection de Bean pas réalisée [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Par défaut Injection de Bean pas réalisée
    Bonjoir,

    je reviens pour un autre problème avec Spring et hibernate ( pour changer ) que je vais tenter de vous exposer au mieux possible.

    J'essaie de réaliser un système de login personnalisé avec Spring et hibernate (sans utiliser Spring Security, je précise).

    Tout se passe bien niveau vue avec ce que j'ai réalisé jusqu'a ce que, lorsque je soumets mon formulaire de Login, PAF un NullPointerException surgit dans mon "LoginValidator"!

    Il semblerait que le "usermanager" que j'utilise n'est pas injecté dans mon validator. J'aimerais donc savoir si quelqu'un aurait une idée du pourquoi du parceque.

    Ci dessous, le code de mon LoginValidator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public class LoginValidator implements Validator {
     
    	protected final Log logger = LogFactory.getLog(getClass());
     
     
    	private UserManager userManager;
     
     
    	public UserManager getUserManager() {
    		return userManager;
    	}
     
    	public void setUserManager(UserManager userManager) {
    		this.userManager = userManager;
    	}
     
    	@Override
    	public boolean supports(Class clazz) {
    		return Login.class.equals(clazz);
    	}
     
    	@Override
    	public void validate(Object obj, Errors errors) {
    		Login login = (Login) obj;
    		if (login.getLogin() == null) {
    			errors.rejectValue("login", "error.login.not-specified", null,
    					"Value required.");
    		} else {
    			if (login.getPassword() == null) {
    				errors
    						.rejectValue("password",
    								"error.password.not-specified", null,
    								"Value required.");
    			}
    			else{
    				logger.info("Validating user " + login.getLogin()+" with password "+login.getPassword());
    				if (!userManager.checkLogin(login.getLogin(), login.getPassword())) {
    					errors.reject("login","error.login.badcreds");
    				}
    			}
    		}
    	}
    }
    Ci après le code de mon applicationcontext.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
     
    	<!-- General  -->
     
    	<bean id="userDao" class="testlogin.dao.UserDaoImpl">
    		<property name="sessionFactory">
    			<ref bean="sessionFactory" />
    		</property>
    	</bean>
     
    	<!-- sessionFactory  -->
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="configLocation">
    			<value>hibernate.cfg.xml</value>
    		</property>
    		<property  name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
    	</bean>
     
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory"/>
    	</bean>
     
    	<bean id="transactionProxy" abstract="true"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref bean="transactionManager"/>
    		</property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="insert*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
    			</props>
    		</property>
    	</bean>
     
    	<bean id="userManagerTarget" class="testlogin.service.UserManagerImpl">
    		<property name="userDao">
    			<ref bean="userDao" />
    		</property>
    	</bean>
     
    	<bean id="userManager" parent="transactionProxy">
    		<property name="target">
    			<ref bean="userManagerTarget"/>
    		</property>
    		<property name="transactionAttributeSource">
    			<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    		</property>
    	</bean>
     
    </beans>
    ci dessous, une partie de mon testlogin-serviette.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<bean name="/login" class="testlogin.web.LoginFormController">
    		<property name="sessionForm" value="true" />
    		<property name="commandName" value="login" />
    		<property name="commandClass" value="testlogin.service.Login" />
    		<property name="validator">
    			<bean class="testlogin.service.LoginValidator" />
    		</property>
    		<property name="formView" value="login" />
    		<property name="successView" value="hello" />
    		<property name="userManager" ref="userManager" />
    	</bean>
    Je me suis servi pour "apprendre" et tenter de mettre en pratique Hibernate et Spring, du tuto de Baptiste Meurant que l'on retrouve ici (que je remercie au passage pour partager ses connaissances! ) mais sans utiliser tapestry mais spring-webmvc à la place.

    Il me semblait que en indiquant dans le testlogin-serviette.xml, dans les propriétés du bean "/login", le "<property name="userManager" ref="userManager" />" , le framework ferait l'injection de bean avec le même nom dans mon LoginValidator, mais ce n'est apparament pas le cas.


    Si quelqu'un peut m'aider ou m'indiquer où je me suis planté, je lui en serai reconnaissant! merci beaucoup!

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,

    Il semblerait que le "usermanager" que j'utilise n'est pas injecté dans mon validator. J'aimerais donc savoir si quelqu'un aurait une idée du pourquoi du parceque.
    C'est assez simple en fait : tu n'as pas dit à Spring de le faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <bean name="/login" class="testlogin.web.LoginFormController">
    		:
    		:
    		<property name="validator">
    			<bean class="testlogin.service.LoginValidator">
    				<property name="userManager" ref="userManager" />
    			</bean>
    		</property>
    		:
    		:
    P.S: Si tu utilises Spring > 2, penses à utiliser le namespace p dans tes fichiers de configuration, ça économise des kilomètres d'XML !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Par défaut
    Aaaahhhhhh

    Merci Djo.Mos je suis un réel boulet! j'avais tellement le nez dedans, que je n'ai même pas prété attention a ça!!

    Ca fonctionne ! merci encore !

    (maintenant j'ai d'autres erreurs ailleurs : a voir si j'ai pas encore fait le boulet autre part )

    [EDIT]
    Je suis allé voir le namespace p, ca simplifie l'écriture des propriétés dans les beans c'est ça? pour raccourcir et rendre l'ensemble plus lisible non?

    Du genre dans mon cas ca donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean class="testlogin.service.LoginValidator" p:name="userManager" p:ref="userManager"/>
    ou je me trompe?

    Merci de l'astuce en tout cas je débute en Spring et ca fait toujours plaisir d'avoir de l'aide!
    [/EDIT]

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    [quote=Yoann.chambonnet;4677440
    Je suis allé voir le namespace p, ca simplifie l'écriture des propriétés dans les beans c'est ça? pour raccourcir et rendre l'ensemble plus lisible non?
    [/quote]
    Tout à fait.

    Du genre dans mon cas ca donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean class="testlogin.service.LoginValidator" p:name="userManager" p:ref="userManager"/>
    ou je me trompe?
    plutôt :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean class="testlogin.service.LoginValidator" p:userManager-ref="userManager" />

    En gros, ça te permet de remplacer un élément fils:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <bean class="...">
      <property name="a" value="x" />
    </bean>
    par un attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean class="..." p:a="x" />
    si c'est une référence :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <bean class="...">
      <property name="b" ref="y" />
    </bean>
    alors ça devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean class="..." p:b-ref="y" />

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Par défaut
    Ok j'ai tout pigé merci de ton explication!

    En effet ca rend le tout beaucoup plus simple à lire jm'en vais réécrire mes fichiers de cette manière!

    Merci du coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. namespace personnalisé et injections de bean
    Par XeN0s67 dans le forum Spring
    Réponses: 1
    Dernier message: 19/01/2008, 21h52
  2. Probleme d'injection de bean
    Par JoloKossovar dans le forum Spring
    Réponses: 4
    Dernier message: 03/01/2008, 17h38
  3. Réponses: 4
    Dernier message: 10/09/2006, 10h49
  4. Réponses: 2
    Dernier message: 23/05/2006, 11h28
  5. boucle que je n'arrive pas à réaliser...
    Par mussara dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 12h24

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