2017-04-26 91 views
1

我在練習Spring框架。下面是我調度-servlet.xml中如何解決AuthenticationPrincipalArgumentResolver的ClassNotFoundException

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
     xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> 

    <context:component-scan base-package="com.yusmle.emusicstore"/> 

    <mvc:annotation-driven> 
     <mvc:argument-resolvers> 
      <bean class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver" /> 
     </mvc:argument-resolvers> 
    </mvc:annotation-driven> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/view/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/> 

    <tx:annotation-driven/> 
</beans> 

而下面是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project 
     xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.yusmle</groupId> 
    <artifactId>emusicstore</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.0.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.0.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>4.0.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>4.1.0.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.0.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.0-api</artifactId> 
      <version>1.0.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.4.190</version> 
     </dependency> 

     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>taglibs</groupId> 
      <artifactId>standard</artifactId> 
      <version>1.1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-fileupload</groupId> 
      <artifactId>commons-fileupload</artifactId> 
      <version>1.2.2</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.2.0.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.0.6.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>4.2.2.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>4.2.2.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>4.2.2.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.5.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.5.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.5.1</version> 
     </dependency> 
    </dependencies> 
</project> 

我這個根據從Udemy的視頻當然這樣做,但我當我嘗試在Tomcat服務器上運行時出現此錯誤:

... 
Caused by: java.lang.IllegalArgumentException: Cannot find class [org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver] 
    at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:283) 
    at org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.wrapWebArgumentResolverBeanDefs(AnnotationDrivenBeanDefinitionParser.java:522) 
    at org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.getArgumentResolvers(AnnotationDrivenBeanDefinitionParser.java:443) 
    at org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.parse(AnnotationDrivenBeanDefinitionParser.java:190) 
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1424) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1414) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:187) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:141) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) 
    ... 56 more 
Caused by: java.lang.ClassNotFoundException: org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1284) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1132) 
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:247) 
    at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:280) 
    ... 67 more 
... 

任何人都可以幫助我嗎?

+0

你還沒有提到tomcat是什麼開始的。它是獨立的還是嵌入式的tomcat?從你的'pom'文件中,我沒有看到這個項目是作爲一個「戰爭」構建的。你如何部署? – Zilvinas

+0

該課程在'spring-security-web'中。如果'jar'在Tomcat的類路徑中(通常是'WEB-INF/lib') - 它應該找到它。 – Zilvinas

+0

糟糕!在我的'pom.xml'文件中添加了'spring-security'依賴項後,我忘了將庫放到/ WEB-INF/lib文件夾中。此外,我將'spring-security'庫的版本更改爲'3.5.2',因爲它在新版本「4.2.2」中給我一些其他錯誤。感謝您的評論,他們真的幫助了我。我使用Intellij IDEA與我聲明的獨立Tomcat(對於像我這樣有問題的其他人)。 – YUSMLE

回答

1

你的彈簧芯是4.0.6.RELEASE而春季安全4.2.2.RELEASE

這意味着彈簧安全看見彈簧芯,要求彈簧core.jar添加類,但這類還沒有(或者已經),因爲版本不同。這會導致ClassNotFoundException的

春季安全核心需要版本彈簧芯的至少4.3.5.RELEASE

的解決方案是統一版本,並解決這些問題,一一爲那些丟失。

找到你需要的版本,搜索(谷歌它)爲maven%artifact_id%,例如'maven spring-security-core',找到你需要的工件並向下滾動到所需的依賴關係。檢查包含的版本是否需要版本或更高版本(通常較高版本與之前版本兼容,但較低版本很少與較高版本兼容)

鏈接到maven資源庫中的spring-security-core:https://mvnrepository.com/artifact/org.springframework.security/spring-security-web/4.2.2.RELEASE

+0

我解決了我的問題後,我看到了您的評論!我的第一個問題是因爲我在我的'pom.xml'文件中添加了'spring-security'依賴項後忘了將庫放到/ WEB-INF/lib文件夾中。在我無法解決問題之後,我嘗試使用它們的更新版本!但你對版本的區別是正確的。 – YUSMLE

0

當你使用maven您不必手動將庫與您WEB-INF/lib

你真正需要做的是定義項目的包裝類型war什麼:

<packaging>war</packaging> 

它會做什麼,當你運行mvn package它會收集你的所有依賴從你的pom.xml,並把它放在他們需要在target文件夾中的位置。

對於您的情況,您可以在target/emusicstore-1.0-SNAPSHOT文件夾中找到可打包的可部署文件,您可以在該文件夾中符號鏈接或引用tomcat應用程序描述符。

相關問題