2016-04-28 40 views
1

比方说,我有以下春天控制器:为什么Spring DispatcherServlet找不到我的控制器方法?

@Controller 
public class FooController 
{ 
    @RequestMapping(value = "/foo", method = RequestMethod.GET, headers = { "Content-Type=text/plain" }) 
    @ResponseBody 
    public String foo(String bar) 
    { 
     return "Bar is " + bar; 
    } 
} 

下面是相关的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_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5"> 
    <display-name>Foo</display-name> 
    <servlet> 
    <servlet-name>FooServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>FooServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
</web-app> 

而这里的相关servlet.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:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 
    <mvc:annotation-driven/> 
    <bean id="FooController" class="foo.FooController"/> 
</beans> 

FYI ,我正在使用Spring Framework 3.0.5版。我知道这是一个旧版本,但这是一个我必须努力的约束。

因此,我将从上面构建的WAR文件(例如FooApp.war)部署到Tomcat(版本7.0.67)。一切都很好。但是,当我浏览到http://localhost:8080/FooApp/foo?bar=baz,我在浏览器中得到一个404错误,并在Tomcat的控制台以下:

Apr 28, 2016 9:43:33 AM org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver handleNoSuchRequestHandlingMethod 
WARNING: No matching handler method found for servlet request: path '/foo', method 'GET', parameters map['bar' -> array<String>['baz']] 

所以我的问题是,我在做什么错在我的配置是造成这个问题?我确定这是一件事,但我很难弄清楚它是什么。

编辑:删除了SimpleUrlHandlerMapping,根据M. Deinum的评论。

+0

你能看到在启动日志中创建的映射吗?如果创建映射,那肯定会在那里提及。你也使用注释,所以你为什么不添加组件:扫描到你的servlet配置,你不需要做手动的URL处理器映射。这在春季支持3 –

+1

删除'SimpleUrlHandlerMapping'。 –

+0

@ M.Deinum谢谢,我删除了它,但我仍然遇到问题。我猜'SimpleUrlHandlerMapping'无论如何都是多余的? –

回答

0

我从here下载了示例项目,并开始研究它和我的测试项目有什么不同。我终于缩小了它在我的控制器方法中@RequestMapping注释中存在的headers = { "Content-Type=text/plain" }。删除它后,一切正常。

-1

将“context:component-scan base-package =”软件包名称“/”添加到servlet.xml中。这将启用您的控制器的自动扫描。

+0

是的,我意识到这一点,但我想了解我在手动设置控制器时做了什么错误。简单地将它留给Spring Framework的“automagic”并没有给我更多的见解。 –

+0

你在做什么手动设置控制器。查看何时在servlet.xml中只定义bean。您的控制器仅被注册为bean。没有控制器属性。好的,在你的xml中添加“context:annotation-config”。它会告诉Spring将Controller作为请求处理程序bean,然后将其注册为控制器。 – Rahul

+0

在servlet.xml中定义了“context:annotation-config”之后,@Controller注释将起作用,因为它将指示spring搜索此注释并将其注册为处理程序。我认为这会帮助你 – Rahul

相关问题