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

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    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...
    Keith Flint 1969 - 2019

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    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>
    Keith Flint 1969 - 2019

  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
    Points : 15 059
    Points
    15 059
    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 extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    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.
    Keith Flint 1969 - 2019

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

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

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

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    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.
    Keith Flint 1969 - 2019

  7. #7
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    Par défaut
    Si je rajoute un @ComponentScan j'ai un autre message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Configuration
    @EnableWebSecurity
    @ComponentScan(value = "com.persistence")
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    C'est dans le package com.persistence que j'ai mes services et mes dao.
    Avec le @ComponentScan le problème c'est qu'il ne connait pas javax.persistence.EntityManagerFactory :
    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
    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 'administrationDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:357)
    	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 [javax.persistence.EntityManagerFactory] is defined
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:590)
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:546)
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:712)
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:685)
    	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354)
    	... 26 more
    ======================
    Edit : Au pire je laisse tomber l'idée d'avoir accès au PersistenceManager en passant par des services et des dao et à la place je fais des requêtes avec DataSource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PreparedStatement ps = dataSource.getConnection().prepareStatement("SELECT * FROM Utilisateur");
       ResultSet rs = ps.executeQuery(););
       while(rs.next()){
          System.out.println(rs.getString(1));
       }    	
       rs.close();
    Keith Flint 1969 - 2019

  8. #8
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    Par défaut
    Du coup je me suis débrouillé sans entityManager.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
       @Autowired
       DataSource dataSource;
     
       @Override
       protected void configure(HttpSecurity http) throws Exception {
          http.authenticationProvider(new CustomAuthenticationProvider(dataSource));
    Mon AuthenticationProvider personnalisé :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    @Component
    public class CustomAuthenticationProvider implements AuthenticationProvider {
       private DataSource dataSource;
     
       public CustomAuthenticationProvider(DataSource dataSource) {
          super();
          this.dataSource = dataSource;
       }
     
       @Override
       public Authentication authenticate(Authentication authentication) throws AuthenticationException{
          String username = authentication.getName().trim();
     
          Authentication auth = null;
     
          Collection <GrantedAuthority> grantedAuths = getAuthorities(username);
          UserParams up = getParams(username);	
     
          ApplicationUser appUser = new ApplicationUser(username, password, up.isEnabled(), true, true, true, grantedAuths, up.getEmail(), up.getProfil());
          auth = new UsernamePasswordAuthenticationToken(appUser, password, grantedAuths);
     
          return auth;
       }
     
       public Collection <GrantedAuthority> getAuthorities(String username) {
          HashSet <GrantedAuthority> authorities = new HashSet <GrantedAuthority> ();
     
          try{
             PreparedStatement ps = dataSource.getConnection().prepareStatement("...");
             ps.setString(1, username);
             ResultSet rs = ps.executeQuery();
             while(rs.next()){
                authorities.add(new SimpleGrantedAuthority(rs.getString(1)));
             }
             rs.close();
          }
          catch(Exception e){
             e.printStackTrace();
          }
     
          return authorities;
       }
     
       public UserParams getParams(String username){
          UserParams up = null;	
    		//
          return up;
       }
     
       public class UserParams{
          private boolean enabled;
          private String email;
          private String profil;
     
          public UserParams(boolean enabled, String email, String profil){
             this.enabled = enabled;
             this.email = email;
             this.profil = profil;
          }
     
          public boolean isEnabled() {
             return enabled;
          }
     
          public String getEmail() {
             return email;
          }
     
          public String getProfil() {
             return profil;
          }
       }
    }
    Ma classe User personnalisée :
    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
    public class ApplicationUser extends User {
       private static final long serialVersionUID = 1L;
       private final String email;
       private final String profil;
     
       public ApplicationUser(String username, String password, boolean enabled, boolean accountNonExpired,
                boolean credentialsNonExpired, boolean accountNonLocked, Collection<GrantedAuthority> authorities,
                String email, String profil) {
          super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
          this.email = email;
          this.profil = profil;
       }
     
       public String getEmail() {
          return email;
       }
     
       public String getProfil(){
          return profil;
       }
    }
    Et là c'est bon je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <sec:authentication property="principal.email" /><br/>
    <sec:authentication property="principal.profil" /><br/>
    Parce que j'ai getEmail() et getProfil() dans ma classe User personnalisée.

    Je vais mettre le topic en résolu, même si c'est un échec quelque part, vu que je n'ai pas pu utiliser @Autowired.
    Mais bon ça fonctionne.
    Keith Flint 1969 - 2019

  9. #9
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 596
    Points : 18 508
    Points
    18 508
    Par défaut
    J'ai changé une partie de ma configuration, pour qu'elle soit en Java au lieu d'en XML. (si ça se trouve je peux même aller jusqu'à virer le web.xml)

    Dans ma classe public class MvcConfig extends WebMvcConfigurerAdapter j'ai ajouté les annotations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ComponentScan({"com.websocket", "com.config", "com.controller", "com.persistence"})
    @EnableTransactionManagement
    Et j'ai ajouté les méthodes :
    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
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    	LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    	em.setDataSource(dataSource());
    	em.setPackagesToScan(new String[] { "com.entities" });
     
    	JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    	em.setJpaVendorAdapter(vendorAdapter);
    	em.setJpaProperties(additionalProperties());
     
    	return em;
    }
     
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    	JpaTransactionManager transactionManager = new JpaTransactionManager();
    	transactionManager.setEntityManagerFactory(emf);
     
    	return transactionManager;
    }
     
    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    	return new PersistenceExceptionTranslationPostProcessor();
    }
     
    Properties additionalProperties() {
    	Properties properties = new Properties();
    	// properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
    	properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
    	return properties;
    }
    Du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @PersistenceContext
    private EntityManager entityManager;
    Fonctionne dans ma classe public class SecurityConfig extends WebSecurityConfigurerAdapter.

    J'ai pas encore fini, mais j'aimerais utiliser un EntityManager au lieu de DataSource.
    Au pire je peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("NomDuProjet");
    EntityManager em = emf.createEntityManager();
    Keith Flint 1969 - 2019

+ 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