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 :

Spring MVC 4 - découpage d'un projet en sous projets


Sujet :

Spring Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 147
    Points : 66
    Points
    66
    Par défaut Spring MVC 4 - découpage d'un projet en sous projets
    Bonjour,

    Je suis partie d'un exemple d'implémentation de Spring security réalisé par Rob Winch :


    Je souhaite à présent découper ce projet en trois sous projets :
    • un projet web - pour la couche présentation
    • un projet métier - pour la couche métier
    • un projet persistance - pour la couche persistance


    J'ai commencé ce découpage en détachant la couche persistance.
    L'application compile avec Gradle mais, lors de l'exécution de l'application web, j'ai une erreur NoClassDefFoundError...
    La trace :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     
    10:28:02.823 [localhost-startStop-1] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'webSecurityConfiguration': AutowiredMethodElement for public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setContentNegotationStrategy(org.springframework.web.accept.ContentNegotiationStrategy)
    10:28:02.823 [localhost-startStop-1] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'webSecurityConfiguration': AutowiredMethodElement for public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setTrustResolver(org.springframework.security.authentication.AuthenticationTrustResolver)
    10:28:02.823 [localhost-startStop-1] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'webSecurityConfiguration': AutowiredFieldElement for private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService
    10:28:02.823 [localhost-startStop-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'userRepositoryUserDetailsService'
    10:28:02.823 [localhost-startStop-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'userRepositoryUserDetailsService'
    10:28:03.011 [localhost-startStop-1] WARN  o.s.w.c.s.AnnotationConfigWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[AbstractBeanFactory$1.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) ~[DefaultSingletonBeanRegistry.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[AbstractApplicationContext.class:4.1.2.RELEASE]
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[AbstractApplicationContext.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) [ContextLoader.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) [ContextLoader.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [ContextLoaderListener.class:4.1.2.RELEASE]
    	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4758) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184) [catalina.jar:8.0.9]
    	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) [catalina.jar:8.0.9]
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25]
    	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555) ~[AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[InjectionMetadata.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	... 22 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:1.8.0_25]
    	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663) ~[na:1.8.0_25]
    	at java.lang.Class.getDeclaredConstructors(Class.java:2012) ~[na:1.8.0_25]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1059) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1032) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[AbstractBeanFactory$1.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) ~[DefaultSingletonBeanRegistry.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527) ~[AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.class:4.1.2.RELEASE]
    	... 24 common frames omitted
    Caused by: java.lang.ClassNotFoundException: fr.MyProject.persistance.data.user.UserRepository
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324) ~[catalina.jar:8.0.9]
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) ~[catalina.jar:8.0.9]
    	... 40 common frames omitted
    10:28:03.011 [localhost-startStop-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6eeb99b: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,rootConfiguration,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,webSecurityConfiguration.H2WebSecurityConfiguration,webSecurityConfiguration.MethodSecurityConfiguration,webSecurityConfiguration,userRepositoryUserDetailsService,welcomePermissionEvaluator,org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration,authenticationManagerBuilder,enableGlobalAuthenticationAutowiredConfigurer,org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration,objectPostProcessor,methodSecurityInterceptor,methodSecurityMetadataSource,preInvocationAuthorizationAdvice,metaDataSourceAdvisor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration,webSecurityExpressionHandler,springSecurityFilterChain,privilegeEvaluator,autowiredWebSecurityConfigurersIgnoreParents,org.springframework.security.config.annotation.web.servlet.configuration.WebMvcSecurityConfiguration,requestDataValueProcessor]; root of factory hierarchy
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'webSecurityConfiguration.H2WebSecurityConfiguration'
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'rootConfiguration'
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'webSecurityConfiguration.MethodSecurityConfiguration'
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration'
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'objectPostProcessor'
    10:28:03.042 [localhost-startStop-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy() on bean with name 'org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration'
    10:28:03.058 [localhost-startStop-1] ERROR o.s.web.context.ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[AbstractBeanFactory$1.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) ~[DefaultSingletonBeanRegistry.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[AbstractApplicationContext.class:4.1.2.RELEASE]
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[AbstractApplicationContext.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) ~[ContextLoader.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) ~[ContextLoader.class:4.1.2.RELEASE]
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [ContextLoaderListener.class:4.1.2.RELEASE]
    	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4758) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184) [catalina.jar:8.0.9]
    	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) [catalina.jar:8.0.9]
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) [catalina.jar:8.0.9]
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25]
    	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555) ~[AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[InjectionMetadata.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	... 22 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:1.8.0_25]
    	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663) ~[na:1.8.0_25]
    	at java.lang.Class.getDeclaredConstructors(Class.java:2012) ~[na:1.8.0_25]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267) ~[AutowiredAnnotationBeanPostProcessor.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1059) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1032) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[AbstractAutowireCapableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[AbstractBeanFactory$1.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) ~[DefaultSingletonBeanRegistry.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[AbstractBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) ~[DefaultListableBeanFactory.class:4.1.2.RELEASE]
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527) ~[AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.class:4.1.2.RELEASE]
    	... 24 common frames omitted
    Caused by: java.lang.ClassNotFoundException: fr.MyProject.persistance.data.user.UserRepository
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324) ~[catalina.jar:8.0.9]
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) ~[catalina.jar:8.0.9]
    	... 40 common frames omitted
    déc. 14, 2014 10:28:03 AM org.apache.catalina.core.StandardContext listenerStart
    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 'webSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
    	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4758)
    	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184)
    	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
    	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
    	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.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService fr.MyProject.presentation.config.WebSecurityConfiguration.userDetailsService; nested exception is java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
    	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    	... 22 more
    Caused by: java.lang.NoClassDefFoundError: fr/MyProject/persistance/data/user/UserRepository
    	at java.lang.Class.getDeclaredConstructors0(Native Method)
    	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663)
    	at java.lang.Class.getDeclaredConstructors(Class.java:2012)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1059)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1032)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
    	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527)
    	... 24 more
    Caused by: java.lang.ClassNotFoundException: fr.MyProject.persistance.data.user.UserRepository
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324)
    	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177)
    	... 40 more
     
    déc. 14, 2014 10:28:03 AM org.apache.catalina.core.StandardContext startInternal
    GRAVE: Error listenerStart
    déc. 14, 2014 10:28:03 AM org.apache.catalina.core.StandardContext startInternal
    GRAVE: Erreur de démarrage du contexte [/MyProject] suite aux erreurs précédentes
    déc. 14, 2014 10:28:03 AM org.apache.catalina.core.ApplicationContext log
    INFOS: Closing Spring root WebApplicationContext
    déc. 14, 2014 10:28:03 AM org.apache.coyote.AbstractProtocol start
    Les fichiers impliqués :

    WebSecurityConfiguration dans le projet web :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    package fr.MyProject.presentation.config;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.annotation.Order;
    import org.springframework.security.access.PermissionEvaluator;
    import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
    import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
    import org.springframework.security.core.userdetails.UserDetailsService;
     
    import fr.MyProject.security.UserRepositoryUserDetailsService;
     
    @Configuration
    @EnableWebMvcSecurity
    @ComponentScan(basePackageClasses = {UserRepositoryUserDetailsService.class})
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService userDetailsService;
     
        @Configuration
        @EnableGlobalMethodSecurity(prePostEnabled = true)
        static class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
            @Autowired
            private PermissionEvaluator permissionEvaluator;
     
            @Override
            protected MethodSecurityExpressionHandler createExpressionHandler() {
                DefaultMethodSecurityExpressionHandler handler =
                        new DefaultMethodSecurityExpressionHandler();
                handler.setPermissionEvaluator(permissionEvaluator);
                return handler;
            }
        }
     
        @Order(1)
        @Configuration
        static class H2WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
     
            // @formatter:off
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .csrf().disable()
                    .headers()
                        .cacheControl()
                        .contentTypeOptions()
                        .httpStrictTransportSecurity()
                        .and()
                    .requestMatchers()
                        .antMatchers("/h2/**")
                        .and()
                    .formLogin()
                        .loginPage("/login")
                        .and()
                    .authorizeRequests()
                        .anyRequest().hasRole("ADMIN")
                        .and()
                	.exceptionHandling().accessDeniedPage("/403");
            }
            // @formatter:on
        }
     
        // @formatter:off
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/resources/**").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
        }
        // @formatter:on
     
        // @formatter:off
        @Autowired
        public void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }
        // @formatter:on
    }
    UserRepositoryUserDetailsService dans le projet web :
    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
     
    package fr.MyProject.security;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.authentication.BadCredentialsException;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Service;
     
    import fr.MyProject.persistance.data.user.User;
    import fr.MyProject.persistance.data.user.UserRepository;
    import fr.MyProject.persistance.data.user.UserRepositoryUserDetails;
     
    @Service
    public class UserRepositoryUserDetailsService implements UserDetailsService {
        private final UserRepository userRepository;
     
        //@Autowired
        public UserRepositoryUserDetailsService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
     
        /* (non-Javadoc)
         * @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
         */
        @Override
        public UserDetails loadUserByUsername(String username)
                throws UsernameNotFoundException {
            User user = userRepository.findByEmail(username);
            if(user == null) {
                throw new UsernameNotFoundException("Could not find user " + username);
            }
            return new UserRepositoryUserDetails(user);
        }
    }
    DataConfiguration dans le projet persistance :
    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
     
    package fr.MyProject.persistance.config;
     
    import javax.sql.DataSource;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.DependsOn;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
    import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.orm.jpa.vendor.Database;
    import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
    import org.springframework.transaction.PlatformTransactionManager;
     
    import fr.MyProject.persistance.data.user.User;
    import fr.MyProject.persistance.data.user.UserRepository;
     
    @Configuration
    @EnableJpaRepositories(basePackageClasses = UserRepository.class)
    public class DataConfiguration {
     
        @Bean
        public DataSource dataSource() {
            EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
            return builder.setType(EmbeddedDatabaseType.H2).build();
        }
     
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            vendorAdapter.setDatabase(Database.H2);
            vendorAdapter.setGenerateDdl(Boolean.TRUE);
            vendorAdapter.setShowSql(Boolean.TRUE);
     
            LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
            factory.setJpaVendorAdapter(vendorAdapter);
            factory.setPackagesToScan(User.class.getPackage().getName());
            factory.setDataSource(dataSource());
     
            return factory;
        }
     
        @Bean
        @DependsOn("entityManagerFactory")
        public ResourceDatabasePopulator initDatabase(DataSource dataSource) throws Exception {
            ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
            populator.addScript(new ClassPathResource("DataBaseInsert.sql"));
            populator.populate(dataSource.getConnection());
            return populator;
        }
     
        @Bean
        public PlatformTransactionManager transactionManager() {
            JpaTransactionManager txManager = new JpaTransactionManager();
            txManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return txManager;
        }
    }
    Ci-dessous, la hiérarchie des projet :
    MyProject
    -MyProject-web
    -MyProject-business
    -MyProject-persistence

    Ci-dessous, ma conf. Gradle :

    pour MyProject :
    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
     
    allprojects {
        apply plugin: 'eclipse'
    }
     
    //Dependencies
    subprojects {
    	version = '0.2'
    	apply plugin: 'eclipse-wtp'
    	apply plugin: 'java'
     
    	sourceCompatibility = 1.8
        targetCompatibility = 1.8
     
    	repositories {
    		mavenCentral()
    		mavenLocal()
    	}
    	ext.slf4jVersion = '1.7.5'
    	ext.springSecurityVersion = "3.2.1.RELEASE"
    	ext.springVersion = "4.1.2.RELEASE"
    	dependencies {
     
    		compile "org.springframework.security:spring-security-config:$springSecurityVersion",
    				"org.hibernate:hibernate-entitymanager:4.3.7.Final",
    				"org.slf4j:slf4j-api:$slf4jVersion",
    				"org.slf4j:log4j-over-slf4j:$slf4jVersion",
    				"org.slf4j:jul-to-slf4j:$slf4jVersion",
    				"org.slf4j:jcl-over-slf4j:$slf4jVersion",
    				"javax.validation:validation-api:1.0.0.GA",
    				"org.hibernate:hibernate-validator:4.2.0.Final",
     
    				//Utils
    				"com.google.guava:guava:18.0",
    				"org.projectlombok:lombok:1.14.8"
    		runtime "opensymphony:sitemesh:2.4.2",
    				"cglib:cglib-nodep:2.2.2",
    				'ch.qos.logback:logback-classic:0.9.30'
     
    		testCompile "junit:junit:4.7",
    				"org.springframework:spring-test:$springVersion",
    				"org.easytesting:fest-assert:1.4"
    	}
     
    	//Gradle version
    	task wrapper(type: Wrapper) {
    		gradleVersion = '2.2.1'
    	}
     
    }
     
    project(':MyProject-web') {
    	dependencies {
    		compile project(":MyProject-persistance")
    	}
    }
     
     
    //Gradle version
    task wrapper(type: Wrapper) {
        gradleVersion = '2.2.1'
    }
    fichier setting de MyProject :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    include ':MyProject-web'
    include ':MyProject-business'
    include ':MyProject-persistance'
    fichier build Gradle pour la partie web :
    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
    buildscript {
        repositories {
            maven { url "http://repo.springsource.org/plugins-release" }
        }
        dependencies {
            classpath("org.gradle.api.plugins:gradle-tomcat-plugin:0.9.9")
        }
    }
     
    apply plugin: 'war'
    apply plugin: 'tomcat'
     
    group = 'fr.MyProject.web'
    war.baseName = 'MyProject'
     
    ext.tilesVersion = "3.0.5"
     
     
    dependencies {
    	providedCompile "javax.servlet:javax.servlet-api:3.0.1",
    					'javax.servlet.jsp:jsp-api:2.1'
     
    	compile "org.springframework.security:spring-security-web:$springSecurityVersion",
    			"org.springframework:spring-webmvc:$springVersion",
    			"javax.servlet:jstl:1.2",
    			"javax.validation:validation-api:1.0.0.GA",
    			"org.hibernate:hibernate-validator:4.2.0.Final",
    			"javax.servlet:jstl:1.2",
    			"org.thymeleaf:thymeleaf-spring4:2.1.2.RELEASE",
    			"org.thymeleaf.extras:thymeleaf-extras-tiles2-spring4:2.1.1.RELEASE",
    			"org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE"
    	//Sub project		
    	compile project(":MyProject-persistance")
    	//testCompile project(":MyProject-persistance").sourceSets.test.output
     
    	runtime "opensymphony:sitemesh:2.4.2",
    			"cglib:cglib-nodep:2.2.2",
    			'ch.qos.logback:logback-classic:0.9.30'
    }
     
    }

    fichier build Gradle pour la partie web :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    apply plugin: 'java'
    group = 'fr.MyProject.persistance'
     
    dependencies {
    	compile "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final",
    	"com.h2database:h2:1.3.168",
    	"org.springframework.data:spring-data-jpa:1.7.1.RELEASE"
    }
    Pouvez-vous m'aider ?
    J'ai du rater un certain nombre de trucs ...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 147
    Points : 66
    Points
    66
    Par défaut
    Sinon, si vous avez des exemples de projets sous Github utilisant Gradle avec un découpage propre entre les couches, je suis preneur

Discussions similaires

  1. Réponses: 23
    Dernier message: 02/07/2010, 11h02
  2. Projets et sous-projets dans Eclipse
    Par zarathoustroy dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 09/03/2010, 09h56
  3. Projet et sous projet
    Par dams77 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 22/12/2007, 16h18
  4. Projet et sous-projet, interrogation
    Par KiLVaiDeN dans le forum Spring
    Réponses: 3
    Dernier message: 02/05/2007, 13h59
  5. [eclipse 3.0.1] Création de projet avec sous-projet
    Par whilecoyote dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 11/07/2005, 10h31

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