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 ...