java.lang.NoSuchMethodError with @PreAuthorize annotation
I use Spring Security 3 with Tomcat 7. My http tag definition is like that:
<http auto-config="false" disable-url-rewriting="true"
entry-point-ref="loginUrlAuthenticationEntryPoint" use-expressions="true">
...
However when I want to use method based security as like:
@RequestMapping(method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_USER')")
public
@ResponseBody
List<Lenhos> getAllLenhosInJSON() {
return new ArrayList<Lenhos>(lenhoMap.values());
}
and run my application I get a 404 not found error at web side and the error is as follows at Tomcat:
ERROR ContextLoader:220 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'LenhoConf' defined in file [/web-core/target/web-core/WEB-INF/classes/com/almen/donho/webcore/controller/LenhoConf.class]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4681)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5184)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5179)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:636)
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.springframework.aop.framework.Cglib2AopProxy.createEnhancer(Cglib2AopProxy.java:228)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:170)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 19 more
Error occured when I added @PreAuthorize("hasRole('ROLE_USER')")
. What may be the cause of that error?
PS: 1 My pom.xml file as follows:
<properties>
<spring.version>3.0.5.RELEASE</spring.version>
</properties>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring security dependencies -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Jackson JSON Mapper -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<build>
<finalName>web-core</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
I don't use hibernate at my project however I import some modules(I use Intellij IDEA) into my application and they use. There is nothing runs related to Hibernate when I run my application. I am new to Spring.
PS 2: This is my dependency tree:
[INFO] [dependency:tree {execution: default-cli}]
[INFO] xxx:web-core:war:1.0-SNAPSHOT
[INFO] +- :xxx-yyy:jar:1.0-SNAPSHOT:compile
[INFO] | +- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
[INFO] | \- org.hibernate:hibernate-entitymanager:jar:3.6.6.Final:compile
[INFO] | \- cglib:cglib:jar:2.2:compile
[INFO] \- xxx:zzz:jar:1.0-SNAPSHOT:compile
[INFO] \- org.hibernate:hibernate:jar:3.2.7.ga:compile
[INFO] +- asm:asm-attrs:jar:1.5.3:compile
[INFO] \- asm:asm:jar:1.5.3:compile
yyy and zzz other modules of my application that I use.
PS 3: My new dependency tree:
[INFO] xxx:web-core:war:1.0-SNAPSHOT
[INFO] \- xxx-yyy:jar:1.0-SNAPSHOT:compile
[INFO] +- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
[INFO] +- org.hibernate:hibernate-commons-annotations:jar:3.3.0.ga:compile
[INFO] | \- org.hibernate:hibernate:jar:3.2.1.ga:compile
[INFO] | +- asm:asm-attr开发者_如何学Cs:jar:1.5.3:compile
[INFO] | \- asm:asm:jar:1.5.3:compile
[INFO] \- org.hibernate:hibernate-entitymanager:jar:3.6.6.Final:compile
[INFO] \- cglib:cglib:jar:2.2:compile
NoSuchMethodError seems to suggest that you are using different version of ObjectWeb ASM than the one that CGLIB uses (used by Spring AOP to dynamically generate classes).
I would suggest you to check that ASM and CGLIB JARs that you are using to run this code are compatible with the ones in Spring Security 3 distribution.
UPDATE: Check out Spring 2.0 AOP: ASM Dependencies thread on Spring forums. It is about Spring 2 AOP, but the errors look suspiciously similar, so the solution might me the same.
UPDATE 2: Looking at your dependency tree, I would say that most of your problems start from the fact that you have two versions of Hibernate in your dependency tree:
- xxx:zzz:jar depends on org.hibernate:hibernate:jar:3.2.7.ga
- xxx-yyy:jar depends on org.hibernate:hibernate-entitymanager:jar:3.6.6.Final
I would suggest updating xxx:zzz:jar project to also use 3.6.6.Final version of Hibernate.
This should resolve the issue, as Hibernate 3.6.6 and Spring AOP 3.0.5 both depend on CGLIB 2.2.
精彩评论