为什么Spring RequestMapping在没有@Controller的情况下无法运行?

时间:2015-07-08 13:24:17

标签: java xml spring

我有示例代码:

的web.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    <bean id="myController" class="biz.tugay.springWebOne.MyController"/>
</beans>

springDispatcher-servlet.xml中

package biz.tugay.springWebOne;
/* User: koray@tugay.biz Date: 08/07/15 Time: 15:25 */

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    @RequestMapping(value = "/hello")
    public String helloWorld(){
        return "index.jsp";
    }
}

MyController.java

 @Controller

嗯,这个代码一切正常。但是,当我删除

HTTP ERROR 404

Problem accessing /hello. Reason:

    Not Found

来自 MyController 类,我会得到:

MainApplication

我没有使用组件扫描,我使用的是基于xml的配置。为什么我需要@Controller注释?

4 个答案:

答案 0 :(得分:1)

来自春季参考文档here

  

@Controller注释充当注释的构造型   类,表明它的作用。 调度程序扫描此类注释   映射方法的类并检测@RequestMapping注释

所以 @Controller 需要告诉调度员扫描此类中的映射,而不仅仅是组件扫描。

答案 1 :(得分:0)

如果您正在使用组件扫描,那么在没有@Controller注释的情况下,Spring将不知道在哪里扫描@RequestMapping。如果您想使用XML配置您的请求映射,那么应该可以像这里的答案之一那样完成:@RequestMapping with XML

答案 2 :(得分:0)

您的示例将无效,因为@Controller注释本质上是告诉组件扫描程序扫描此类的“入口点”,没有@Controller所有其他Spring控制器注释(例如@RequestMapping })将被忽略。

我注意到你指出你没有使用组件扫描并且你正在使用基于xml的配置,但实际上你正在尝试将基于xml和基于注释的配置混合到一个类中,这将导致非常草率的代码。我建议删除xml bean定义并仅使用@Controller注释并在xml中添加component-scan标记来清理代码。

如果您决定仍想进行xml配置,则应删除@RequestMapping注释并将其替换为以下xml。

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
      <map>
         <entry key="/hello" value-ref="myController"/>
      </map>
   </property>
</bean>

答案 3 :(得分:-1)

如果要在没有注释的情况下使用Spring,那么可以使用BeanNameUrlHandlerMapping指示Dispatcher的控制器类。因此,只需将以下bean添加到XML中,您就不必再包含@Controller: