【问题标题】:Spring MVC AnnotationsSpring MVC 注解
【发布时间】:2011-07-09 16:36:09
【问题描述】:

我已经看过 Spring 的文档几次,但我似乎无法让 @Controller 等注释工作。

我正在我的 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 clean install 结果:

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

【问题讨论】:

  • 您的控制器是否位于基本包中?
  • “构建项目失败”是什么意思?

标签: java eclipse maven-2 spring-mvc spring-annotations


【解决方案1】:

这可能与您设置为 Spring 依赖项的范围有关。您已将它们设置为“运行时”,这意味着它们不用于编译,仅在运行时需要。这可以解释为什么它不会在 Eclipse 中编译(并且可能也是您的 Maven 构建中的问题,尽管您没有指定错误)。

只需删除作用域以使用默认作用域(默认为编译,在这种情况下,这很可能是您想要的),看看这是否能让您更进一步。

更新:

感谢您添加您遇到的具体错误。

这意味着 Maven 正在尝试使用本地依赖项,但无法打开 jar 文件。我看到这种情况有时会发生,即 jar 在下载过程中损坏或仅下载部分内容。

尝试删除 ~/.m2/repository/org/aopalliance/com.springsource.org.aopalliance/ 目录并重新运行构建。这将导致 Maven 重新下载它并希望它处于良好状态。

【讨论】:

  • 如果我删除范围,Maven 无法构建,即使没有注释(见编辑)。
  • 嗯,我删除了一些文件夹并重新运行,Maven似乎还可以。但是现在当我部署到 Tomcat 时,我收到“dispatcherServlet 不可用”错误。此外,Eclipse 仍然无法识别注解导入。
【解决方案2】:

我在稍后的帖子中找到了我的问题的答案。

基本上,我需要将 m2eclipse 插件添加到 Eclipse。如果需要,您可以在http://m2eclipse.sonatype.org/installing-m2eclipse.html 找到说明。安装后,您可以在 Eclipse 中右键单击您的项目并选择 Maven > Enable Dependency Management。然后 eclipse 将能够识别来自您的 POM 依赖项的导入。

所以最后,我得到了以下结果。 Eclipse 识别一切,Maven 正确构建并打包项目,Tomcat 成功部署项目。

这是我连接调度程序 servlet 的 web.xml:

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

希望这对其他人有所帮助。

【讨论】:

    【解决方案3】:

    确保你的 Eclipse 缓存版本的 repo 索引是最新的,你甚至可以使用 maven repo view 手动更新索引并从那里更新。

    如果我从某个 IDE 收到错误,我总是尝试使用我的 maven 构建的 vanilla 版本(命令行)。

    【讨论】:

      【解决方案4】:

      在下面使用并尝试,注释处理程序应该在您的应用程序上下文.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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 2012-09-20
        • 2011-04-08
        • 1970-01-01
        • 2011-06-13
        • 2013-09-03
        • 2012-11-04
        相关资源
        最近更新 更多