2011-03-06 66 views
5

我已經在Spring的文檔中多次使用過了,但是我似乎無法獲得@Controller等註釋來工作。Spring MVC註解

我加載在我的POM的依賴關係和存儲庫(...是我的具體值):

<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>...</groupId> 
    <artifactId>...</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>...</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>org.springframework.context</artifactId> 
     <version>${org.springframework.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>org.springframework.web.servlet</artifactId> 
     <version>${org.springframework.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    </dependencies> 

    <repositories> 
    <repository> 
     <id>com.springsource.repository.bundles.release</id> 
     <url>http://repository.springsource.com/maven/bundles/release/</url> 
    </repository> 
    <repository> 
     <id>com.springsource.repository.bundles.external</id> 
     <url>http://respoitory.springsource.com/maven/bundles/external</url> 
    </repository> 
    </repositories> 
</project> 

在我的web.xml,我設立了調度員的servlet:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
     version="2.4"> 

    <servlet> 
     <servlet-name>DispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>DispatcherServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

而在WEB-INF我的servlet-context.xml中(...是我的控制器封裝):

<?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" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc 
         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
         http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

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

    <mvc:annotation-driven /> 

    <!-- Adds prefix and suffix to returned views --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 

我想我一定缺少或忘記一些簡單的事情。 Eclipse無法識別註釋,maven無法構建項目。有人可以幫我從這裏出去嗎?

編輯

爲了進一步澄清,在Eclipse中添加註釋中的結果:

The import org.springframework cannot be resolved 

並運行MVN全新安裝的結果:

package org.springframework.stereotype does not exist 

和刪除運行時範圍導致以下Maven錯誤:

error reading ...\.m2\repository\org\aopalliance\com.springsource.org.aopalliance\1.0.0\com.springsource.org.aopalliance-1.9.9.jar; error in opening zip file 
+0

您的控制器是否位於基礎包? –

+1

「建設項目失敗」是什麼意思? – skaffman

+0

是的,它是基本包裝。 – mathlovingkitten

回答

4

我在後面的帖子中找到了我的問題的答案。

基本上,我需要將m2eclipse插件添加到Eclipse。如果需要,您可以在http://m2eclipse.sonatype.org/installing-m2eclipse.html找到說明。安裝完成後,您可以在Eclipse中右鍵單擊您的項目,然後選擇Maven>啓用依賴管理。然後eclipse將能夠識別來自POM依賴項的導入。

所以最後我有以下幾點。Eclipse認可了一切,Maven正確地構建並打包了該項目,Tomcat成功部署了該項目。

,這裏是我的web.xml掛鉤調度的servlet:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     id="CoreProject" version="3.0"> 

    <!-- SERVLET FOR HANDLING ALL INCOMING REQUESTS --> 
    <servlet> 
     <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- SERVLET MAPPING FOR HANDLING ALL INCOMING REQUESTS --> 
    <servlet-mapping> 
     <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

,這裏是我的servlet-context.xml中啓用註釋和視圖解析器:

<?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" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc 
          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- SCANS ALL MATCHING PACKAGES FOR COMPONENTS --> 
    <context:component-scan base-package="com.myBasePackage" /> 

    <!-- ALLOWS FOR ANNOTATION MAPPING FOR CONTROLLERS --> 
    <mvc:annotation-driven /> 

    <!-- ADDS PREFIX AND SUFFIX TO RETURNED VIEWS --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 
</beans> 

這是我的POM文件:

<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.myBasePackage</groupId> 
    <artifactId>CoreProject</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>CoreProject</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version> 
    </properties> 

    <dependencies> 
    <!-- SERVLET DEPENDENCIES --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <!-- SPRING DEPENDENCIES --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <!-- TESTING DEPENDENCIES --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

希望這可以幫助別人。

6

它可能與您設置爲Spring依賴項的範圍有關。您已將它們設置爲「運行時」,這意味着它們不用於編譯,只在運行時才需要。這可以解釋爲什麼它不能在Eclipse中編譯(也可能是Maven構建中的問題,儘管你沒有指定錯誤)。

只需刪除範圍以使用默認範圍(默認爲compile,這很可能是您在此例中想要的),然後查看是否讓您更進一步。

更新:

感謝您將您收到的具體錯誤。

這意味着Maven試圖使用本地依賴項,但無法打開該jar文件。我發現有時會發生這種情況,有時在下載過程中jar被破壞或部分下載。

嘗試刪除〜/ .m2/repository/org/aopalliance/com.springsource.org.aopalliance /目錄並重新運行構建。這將導致Maven重新下載它,並希望它處於良好的狀態。

+0

如果我刪除範圍,Maven無法構建,即使不包含註釋(請參閱編輯)。 – mathlovingkitten

+0

好吧,我刪除了一些文件夾和reran,Maven似乎沒問題。但是現在,當我部署到Tomcat時,出現「dispatcherServlet不可用」錯誤。另外,Eclipse仍然不認可註釋導入。 – mathlovingkitten

0

確保您的eclipse緩存版本的回購索引是最新的,您甚至可以通過使用maven回購視圖手動更新索引並從那裏更新它。

我總是嘗試我的maven版本的香草版本(命令行),如果我從某個IDE得到錯誤。

0

使用下面和嘗試,註釋處理程序應使用如下您的應用程序上下文的.xml

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
<property name="order" value="0"/> 
    </bean> 

這將解決刻板印象錯誤

如果沒有工作添加以下行XSI:的schemaLocation

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd