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 :

Problème avec l'annotation @Autowired


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 268
    Par défaut Problème avec l'annotation @Autowired
    Bonjour.

    Pour la gestion de la Persistence j'utilise l'annotation @Autowired et tout fonctionne très bien.
    J'ai des Services :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Service
    public class MonService implements InterfaceDeMonService{
     
        @Autowired
        private MonDao dao;
     
       @Override
       @Transactional (readOnly=true)
       public JSONObject methodeService() {
          dao.methodeDao();
    Des Dao :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Repository
    public class MonDao implements InterfaceDeMonDao{
       @PersistenceContext
        private EntityManager entityManager;
     
       @Override
       public JSONArray methodeDao() {
          Query query = entitManager.createQuery(...
    Et ça fonctionne dans les Contrôleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Controller
    public class AdminController {
        @Autowired
        private MonService service;
     
        @RequestMapping("/page/que/je/veux")
        public @ResponseBody ModelAndView page() {
            service.methodeService();
    Là ça marche sans problème.
    Mais si ailleurs j'essaie de récupérer le même service avec @Autowired, j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'NomDeLaClasse': Unsatisfied dependency expressed through field 'service': No qualifying bean of type [com.MonService] found for dependency
    Là en l’occurrence c'est dans la classe qui extends WebSecurityConfigurerAdapter.

    Mais au pire si ça ne fonctionne pas là, ce n'est pas grave, j'en ai pas besoin pour l'instant.
    Par contre j'ai voulu avoir des propriétés personnalisées avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <sec:authentication property="principal.username" />
    principal.username fonctionne sans problème, mais j'ai voulu en avoir d'autre comme principal.email par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
        @Autowired
        DataSource dataSource;
     
        @Override
        protected void configure(HttpSecurity http) throws Exception {
        	http.authenticationProvider(new CustomAuthenticationProvider());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class CustomAuthenticationProvider implements AuthenticationProvider {
     
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            Authentication auth = null;
            ApplicationUser appUser = new ApplicationUser(...);
            auth = new UsernamePasswordAuthenticationToken(appUser, password, grantedAuths);
            return auth;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class ApplicationUser extends User {
     
        public String getEmail() {
            return email;
        }
    Dans la classe qui extends WebSecurityConfigurerAdapter, il y a une méthode protected void configure(HttpSecurity http), dans cette méthode j'utilise mon propre AuthentificationProvider : http.authenticationProvider(new CustomAuthenticationProvider());, la classe CustomAuthentificationProvider possède une instance de classe qui extends User.

    Le bon côté c'est que depuis le jsp je peux faire principal.email et ça marche.
    Par contre je ne peux pas avoir accès au service qui gère la persistance pour faire des requêtes dans la base de données...
    Là j'ai même pas de message d'erreur c'est juste complètement ignoré.

    Si vous avez des conseils, des idées, merci de m'en faire part.
    Merci d'avance.
    Bonne journée.
    Cordialement.

    =====
    EDIT : J'ai rajouté l'annotation @Component dans ma classe CustomAuthenticationProvider et je retrouve la même erreur.

    Dans les contrôleurs @Autowired fonctionne mais pas dans la configuration...

  2. #2
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 268
    Par défaut
    Je pense que le problème peut venir de ma configuration en XML.
    Dans mon web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<servlet>
    		<servlet-name>appServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    		<async-supported>true</async-supported>
    	</servlet>
    Le fichier servlet-context.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
    <?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:context="http://www.springframework.org/schema/context"
    	xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    		http://www.springframework.org/schema/context
    		http://www.springframework.org/schema/context/spring-context-4.0.xsd
    		http://www.springframework.org/schema/mvc
    		http://www.springframework.org/schema/mvc/spring-mvc.xsd
    		http://www.springframework.org/schema/tx 
    		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
     
     
    	<context:component-scan base-package="com.persistence" />
    	<context:component-scan base-package="com.websocket" />
    	<context:component-scan base-package="com.controller" />
    	<context:component-scan base-package="com.config" />
     
    	<tx:annotation-driven transaction-manager="transactionManager" />                
    	<mvc:annotation-driven />
     
    	<bean
    		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/WEB-INF/jsp/" />
    		<property name="suffix" value=".jsp" />
    	</bean>
     
    	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    		<property name="jndiName" value="java:comp/env/jdbc/dsMonApplication" />
    	</bean>
     
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    		<property name="dataSource" ref="dataSource" />
    	</bean>
     
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    </beans>

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <context:component-scan base-package="com.persistence" />
    	<context:component-scan base-package="com.websocket" />
    	<context:component-scan base-package="com.controller" />
    	<context:component-scan base-package="com.config" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <context:component-scan base-package="com.persistence,com.websocket,com.controller,com.config" />
    Sinon, montre nous l'erreur en entier et la classe MonService.

    A+.

  4. #4
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 268
    Par défaut
    J'ai changé le component-scan, merci du conseil.

    Si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Component
    public class CustomAuthenticationProvider implements AuthenticationProvider {
    	@Autowired
    	private IUserService service;
    Voilà le message d'erreur complet :
    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
    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.UnsatisfiedDependencyException: Error creating bean with name 'customAuthenticationProvider': Unsatisfied dependency expressed through field 'service': No qualifying bean of type [com.persistence.service.interfaces.IUserService] found for dependency [com.persistence.service.interfaces.IUserService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.persistence.service.interfaces.IUserService] found for dependency [com.persistence.service.interfaces.IUserService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775)
    	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809)
    	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251)
    	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:587)
    	at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1798)
    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at java.lang.Thread.run(Thread.java:745)
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.persistence.service.interfaces.IUserService] found for dependency [com.persistence.service.interfaces.IUserService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1403)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1056)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    	... 28 more
    On dirait qu'à ce moment là, le bean n'existe pas encore.
    Dans la configuration ça ne fonctionne pas, mais ailleurs si.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Il est définis comment to nbean IUserService?

  6. #6
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 268
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package com.persistence.service.interfaces;
     
    public interface IUserService {
       ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Service
    public class UserService implements IUserService{
       @Autowired
       private IUserDao dao;
     
       ...
    }
    J'ai plusieurs contrôleurs, une dizaines de Services et autant de DAO (vu que chaque Service a son DAO).
    Dans les contrôleurs je n'ai aucun problème pour récupérer un service avec @Autowired.

    Dans toutes les classes avec @Controller ça fonctionne, par contre ce n'est pas le cas dans les classes @Component ou @Service.
    On dirait que la configuration se fait avant les services.

    Quoi que c'est peut être pas exactement ça, parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
       @Autowired
       DataSource dataSource;
     
       @Autowired
       public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {	
          ...
       }
    L'objet dataSource fonctionne alors que c'est dans une classe de configuration ou les autres @Autowired ne fonctionnent pas.
    La différence c'est peut être que dataSource a été déclaré en XML et les autres avec des annotations.

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

Discussions similaires

  1. [Framework] Problème avec l'annotation Autowired
    Par riadhhwajdii dans le forum Spring
    Réponses: 5
    Dernier message: 17/02/2012, 20h39
  2. [MVC] Problème avec l'annotation @Autowired dans le @Controller
    Par rolandl dans le forum Spring Web
    Réponses: 0
    Dernier message: 31/12/2011, 02h18
  3. [Security] Problème avec methodSecurityInterceptor & annotations
    Par M.a.n.u. dans le forum Spring
    Réponses: 0
    Dernier message: 01/04/2009, 11h22
  4. [EJB3 Entity] Problème avec les annotations pour une List d'Enum
    Par uiscias dans le forum Java EE
    Réponses: 2
    Dernier message: 31/03/2009, 17h09
  5. Problème avec des annotations
    Par ploxien dans le forum Langage
    Réponses: 8
    Dernier message: 18/04/2007, 10h45

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