是啥导致此 Spring MVC 应用程序中的映射失败?

Posted

技术标签:

【中文标题】是啥导致此 Spring MVC 应用程序中的映射失败?【英文标题】:What is causing the mapping failure in this Spring MVC app?是什么导致此 Spring MVC 应用程序中的映射失败? 【发布时间】:2012-04-20 19:14:59 【问题描述】:

我正在尝试让一个非常简单的 Spring @mvc 应用程序工作,但我遇到了似乎是映射错误的问题。

来自 web.xml:

<servlet>
    <servlet-name>works</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

控制器:

@Controller
@RequestMapping("/test")
public class TESTController  
    private static Logger appLogger = Logger.getLogger("AppLogFile");

    public String serviceRequest(   Model model)
    
        appLogger.info("======================= TESTController GET ===============================");
        model.addAttribute("returnString","TESTController handled the request") ;
        return "SingleStringView"; 
    

works-servlet.xml:

<context:component-scan base-package="com.ami.dbconnect.controller" />

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

    <bean id="TESTController" class="com.ami.dbconnect.controller.TESTController"></bean>

    <!-- view resolver not shown -->

应用程序部署到 /webapps/works 的 Tomcat 7。 Tomcat文件结构为:

webapps
    /works
        /WEB-INF
            /classes
            /lib

我正在尝试使用 url 调用控制器:localhost:8080/works/test

在 tomcat7-stdout 中我看到了:

1106 [pool-2-thread-1] 调试 org.springframework.web.servlet.DispatcherServlet - 将 servlet 'works' 的 WebApplicationContext 发布为 ServletContext 属性,名称为 [org.springframework.web.servlet.FrameworkServlet.CONTEXT.works ]

1106 [pool-2-thread-1] INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'works':初始化在 728 毫秒内完成

1106 [pool-2-thread-1] 调试 org.springframework.web.servlet.DispatcherServlet - Servlet 'works' 配置成功

14068 [http-apr-8080-exec-2] 调试 org.springframework.web.servlet.DispatcherServlet - 名为“works”的 DispatcherServlet 处理 [/works/test] 的 GET 请求

14071 [http-apr-8080-exec-2] 警告 org.springframework.web.servlet.PageNotFound - 在 DispatcherServlet 中找不到带有 URI [/works/test] 的 HTTP 请求的映射,名称为“works”

所以我的问题(终于!): Spring 是否无法识别控制器中的注释?如果没有,这个简单的设置可能有什么问题?

感谢您的任何帮助或建议, 狡猾的

【问题讨论】:

【参考方案1】:

您需要将 @RequestMapping 注释移动到您的 serviceRequest 方法中。

类级别的@RequestMapping 可用于为该类的所有@RequestMapping-annotated 指定公共路径前缀,但如果没有方法级别的注释,它不会生效。

【讨论】:

【参考方案2】:

也许问题出在 servlet 映射部分? 尝试改变:

<servlet-mapping>
    <servlet-name>works</servlet-name>
    <url-pattern>/works/*</url-pattern>
</servlet-mapping>

然后再试一次。

【讨论】:

以上是关于是啥导致此 Spring MVC 应用程序中的映射失败?的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc的工作流程是啥?

spring mvc的工作流程是啥?

对于没有 XML 的 Spring MVC 中的双调度程序配置,URL 映射无法按预期工作

Struts和spring分别是啥?

Spring mvc 发现不明确的映射。无法映射控制器 bean 方法

三层架构是啥?