java.lang.NoSuchMethodError с аннотацией @PreAuthorize - PullRequest
1 голос
/ 13 сентября 2011

Я использую Spring Security 3 с Tomcat 7. Мое определение тега http выглядит следующим образом:

<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 not found на веб-стороне, и ошибка в 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>

Я не использую hibernate в моем проектеОднако я импортирую некоторые модули (я использую 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

1 Ответ

3 голосов
/ 13 сентября 2011

NoSuchMethodError, похоже, предполагает, что вы используете другую версию ObjectWeb ASM , отличную от той, которую использует CGLIB (используется Spring AOP для динамической генерации классов).

Я бы посоветовал вам проверить, что JAR-файлы ASM и CGLIB, которые вы используете для запуска этого кода, совместимы с таковыми в дистрибутиве Spring Security 3.

ОБНОВЛЕНИЕ : проверить Spring 2.0 AOP: Зависимость ASM ветка на форумах Spring.Речь идет о Spring 2 AOP, но ошибки выглядят подозрительно похожими, поэтому решение может быть таким же.

ОБНОВЛЕНИЕ 2 : Глядя на ваше дерево зависимостей, я бы сказал, что большинство вашихпроблемы начинаются с того, что в вашем дереве зависимостей есть две версии Hibernate:

  1. xxx: zzz: jar зависит от org.hibernate: hibernate: jar: 3.2.7.ga
  2. xxx-гггг: jar зависит от org.hibernate: hibernate-entitymanager: jar: 3.6.6.Final

Я бы предложил обновить xxx: zzz: jar также использует 3.6.6. Окончательная версия Hibernate.

Это должно решить проблему, так как Hibernate 3.6.6 и Spring AOP 3.0.5 зависят от CGLIB 2.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...