2011-09-13 45 views
1

我使用Spring Security 3和Tomcat 7.我的HTTP标签的定义是这样的:java.lang.NoSuchMethodError与@PreAuthorize注释

<http auto-config="false" disable-url-rewriting="true" 
entry-point-ref="loginUrlAuthenticationEntryPoint" use-expressions="true"> 
... 

然而,当我想使用基于方法的安全性像:

@RequestMapping(method = RequestMethod.GET) 
@PreAuthorize("hasRole('ROLE_USER')") 
public 
@ResponseBody 
List<Lenhos> getAllLenhosInJSON() { 
    return new ArrayList<Lenhos>(lenhoMap.values()); 
} 

和运行我的应用程序在网络侧获取未找到404错误,错误是在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 

当我加入@PreAuthorize("hasRole('ROLE_USER')")时发生错误。什么可能是该错误的原因?

PS:1个我pom.xml文件如下:

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

我不会在我的项目中使用休眠,但是我导入一些模块(我用的IntelliJ IDEA)到我的应用程序和他们使用。当我运行我的应用程序时,没有任何与Hibernate相关的运行。我对Spring很陌生。

PS 2: 这是我的依赖关系树:我用我的应用程序的

[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 ZZZ和其他模块。

PS 3: 我的新的依赖关系树:

[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-attrs: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 
+0

如果您可以列出以下库的EXACT版本,将会非常有帮助:Spring Security,Spring AOP,CGLIB,ASM。而且,你是否在同一个应用程序中使用Hibernate?如果是的话,那么也是Hibernate的版本。 –

+0

@Neeme Praks我编辑了我的问题。 – kamaci

+0

谢谢,POM很有用,但更有用的是查看实际的依赖关系树。你可以运行“mvn dependency:tree -Dincludes = asm,cglib,org.springframework:spring-aop”并将结果添加到你的问题中吗? –

回答

3

的NoSuchMethodError似乎表明,你正在使用不同版本的ObjectWeb ASM比一个CGLIB使用(使用Spring AOP的动态生成的类) 。

我建议你检查ASM和您正在使用运行该代码CGLIB JAR文件是在春季安全3分布的那些兼容。

UPDATE:在Spring论坛上查看Spring 2.0 AOP: ASM Dependencies线程。这是关于Spring AOP 2,但错误一脸狐疑相似,所以解决方案可能我一样。

更新2:看你的依赖关系树,我会说,你的大部分问题的事实,你有你的依赖关系树的Hibernate的两个版本开始:

  1. XXX:ZZZ:罐子取决于org.hibernate作为:冬眠中:jar:3.2.7.ga
  2. XXX,YYY:罐子取决于org.hibernate作为:休眠-的EntityManager:罐子:3.6.6.Final

我建议更新XXX:ZZZ:JAR项目还使用Hibernate的3.6.6.Final版本。

这应该解决的问题,如Hibernate的3.6.6和Spring AOP 3.0.5都依赖于CGLIB 2.2。

+0

org.hibernate不接受3.6.6.Final作为版本? – kamaci

+0

org.hibernate作为 冬眠 3.6.6.Final kamaci

+0

我建议你试试 “休眠芯” 为artifactId的,Hibernate的球队似乎因为3.6已经放弃了平淡的 “休眠” 的的artifactId .0.Beta2 –