2011-09-13 4 views
1

J'utilise Spring Security 3 avec Tomcat 7. Mon tag http définition est comme ça:java.lang.NoSuchMethodError avec l'annotation @PreAuthorize

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

Cependant quand je veux utiliser comme comme la sécurité à base de méthode:

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

et exécuter ma demande que je reçois une erreur 404 introuvable à côté web et l'erreur est la suivante à 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 

Une erreur s'est produite lors de l'ajout de @PreAuthorize("hasRole('ROLE_USER')"). Quelle peut être la cause de cette erreur?

PS: 1 Mon fichier pom.xml comme suit:

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

Je ne me veille prolongée à mon projet mais j'importer certains modules (j'utiliser IntelliJ IDEA) dans ma demande et ils utilisent . Il n'y a rien de lié à Hibernate quand j'exécute mon application. Je suis nouveau au printemps.

PS 2: Ceci est mon arbre de dépendance:

[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 et zzz autres modules de ma demande que j'utilise.

PS 3: Mon nouvel arbre de dépendance:

[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

Il serait très utile, si vous pouviez lister les versions EXACT des bibliothèques suivantes: Spring Security, Spring AOP, CGLIB, ASM. Et, utilisez-vous Hibernate dans la même application? Si oui, alors aussi la version d'Hibernate. –

+0

@Neeme Praks J'ai modifié ma question. – kamaci

+0

Merci, POM est utile, mais encore plus utile serait de voir l'arbre de dépendance actuel. Pourriez-vous exécuter "dépendance mvn: tree -Dincludes = asm, cglib, org.springframework: spring-aop" et ajouter le résultat à votre question? –

Répondre

3

NoSuchMethodError semble indiquer que vous utilisez la version différente de ObjectWeb ASM que celui qui CGLIB usages (utilisé par Spring AOP pour générer dynamiquement des classes) .

Je vous suggère de vérifier que les fichiers JAR ASM et CGLIB que vous utilisez pour exécuter ce code sont compatibles avec ceux de la distribution Spring Security 3.

MISE À JOUR: Découvrez Spring 2.0 AOP: ASM Dependencies fil sur les forums de printemps. Il s'agit de Spring 2 AOP, mais les erreurs semblent étrangement similaires, donc la solution pourrait être la même.

MISE À JOUR 2: En regardant votre arbre de dépendance, je dirais que la plupart de vos problèmes commencent par le fait que vous avez deux versions d'Hibernate dans votre arbre de dépendance:

  1. xxx: zzz: pot dépend org.hibernate: mise en veille prolongée: pot: 3.2.7.ga
  2. xxx-yyy: pot dépend org.hibernate: mise en veille prolongée-entitymanager: pot: 3.6.6.Final

Je suggère de mettre à jour le projet xxx: zzz: jar pour utiliser également 3.6.6.Final version d'Hibernate.

Cela devrait résoudre le problème, car Hibernate 3.6.6 et Spring AOP 3.0.5 dépendent tous les deux de CGLIB 2.2.

+0

org.hibernate n'accepte pas 3.6.6.Final comme version? – kamaci

+0

org.hibernate mise en veille prolongée 3.6.6.Final kamaci

+0

Je vous suggère d'essayer "hibernate-core" comme artifactId, Hibernate équipe semble avoir abandonné la plaine "mise en veille prolongée" comme artifactId depuis 3.6 .0.Beta2 –

Questions connexes