【问题标题】:Spring MVC URI template problemSpring MVC URI 模板问题
【发布时间】:2011-05-09 21:16:23
【问题描述】:

在 Tomcat 6 上的 Spring MVC 3 中,我似乎无法让 /x/y/z 形式的 RequestMappings 工作。 /x/y 似乎工作正常,这就是文档中所有示例所显示的内容。

例如,为什么会这样

@RequestMapping(value="/browse/{categoryName}"); 

但这不起作用:

@RequestMapping(value="/browse/category/{categoryName}");

浏览到http://localhost:8080/myapp/browse/category/books 会从 Tomcat 生成 HTTP 404。该方法如下所示:

@Controller
public class BrowseController {
    @RequestMapping(value = "/browse/category/{categoryName}", method = RequestMethod.GET)
    public String showCategory(@PathVariable("categoryName") String categoryName, Model model) {
        model.addAttribute("categoryName", categoryName);
        return "Browse";
    }
}

我在 Netbeans 6.9 的 Tomcat 输出窗口中看到此消息:

Nov 14, 2010 2:02:03 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/myapp/browse/category/model] in DispatcherServlet with name 'dispatcher'

编辑:从日志中添加了更多跟踪信息。请忽略时间戳,因为这个问题是在两天内编辑的。

部署应用时:

Nov 15, 2010 9:33:28 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Mon Nov 15 21:33:28 EST 2010]; parent: Root WebApplicationContext
Nov 15, 2010 9:33:28 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
Nov 15, 2010 9:33:29 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@143c423: defining beans [browseController,homeController,showController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping#0,viewResolver]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@1ea763a
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/browse] onto handler 'browseController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/browse/*] onto handler 'browseController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/home] onto handler 'homeController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/home/*] onto handler 'homeController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/show] onto handler 'showController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/show/*] onto handler 'showController'
Nov 15, 2010 9:33:29 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: FrameworkServlet 'dispatcher': initialization completed in 501 ms

当我拨打http://localhost:8080/myapp/browse/category/model时,

Nov 15, 2010 9:34:28 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/myapp/browse/category/model] in DispatcherServlet with name 'dispatcher'

这是我的 web.xml 调度程序配置:

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

那么,为什么我的 URI 模式有效,而另一个无效?

【问题讨论】:

  • 你确定{categoryName} 持有books 吗??
  • 什么意思?它还能容纳什么?
  • @Sajee:你用的是哪个版本的 Spring?
  • 调度程序 servlet 的映射是什么?是/* 吗?如果不是,您可能需要正确限定 URL。
  • @Teja, dispatcher/

标签: java spring-mvc


【解决方案1】:

您可能想要为浏览控制器添加请求映射。试试这个

@Controller
@RequestMapping("/browse")
public class BrowseController
{
    @RequestMapping(value = "/category/{categoryName}", method = RequestMethod.GET)
    public String showCategory(@PathVariable("categoryName") String categoryName, Model model)
    { 
        model.addAttribute("categoryName", categoryName);
        return "Browse";
    }
}

【讨论】:

  • 试过了,遗憾的是它也产生了 HTTP 404。
  • 你的 spring 配置中有 吗?如果不是,那将是一个问题。
  • 我认为 Spring 3 没有必要这样做。正如我原来的问题中所指出的,注释是有效的,但特定的除外。
【解决方案2】:

在另一个线程上修复了问题: spring-mvc: how to map URI templates in the form of "a/b/{c}"?

【讨论】:

    【解决方案3】:

    您的 URL 模式在 servlet 映射中应该是 /*。

    【讨论】:

    • 在我做出改变后,我得到了 404 的所有结果。
    • 您能告诉我启用日志记录所需的步骤吗?日志文件位于何处?
    • 将 log4j.properties 添加到您的类中并添加 log4jConfigLocation/WEB-INF/classes/log4j.properties org.springframework.web.util.Log4jConfigListener 到你的 web.xml 文件
    • 我在上面的原始帖子中添加了日志输出。有什么线索吗?
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多