2011-03-06 63 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