<context:component-scan>如果在XML中定义处理程序映射</context:component-scan>,则不会获取我的@RequestMappings

时间:2011-09-18 17:24:06

标签: java spring controller annotations spring-3

我在我的控制器上使用带有<context:component-scan>@RequestMapping注释的Spring 3.0.5。这样可以工作,并且包扫描会注册URL。

但是当我在XML配置中定义了处理程序映射时会出现问题。 <{1}}注释不再被选中。

我已将问题隔离到一个简单的应用程序中。

如果我有以下控制器:

@RequestMapping

以及以下配置:

package test.pack.age;

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

@Controller
public class TestController {
    @RequestMapping(value="/test")
    public String showTestPage() {
        return "testPage";
    }
}

该应用程序正常运行,URL <context:component-scan base-package="test.pack.age" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> 已注册并正常运行。

/test

但是,如果我将处理程序映射添加到XML,它就不再起作用了。甚至像这样简单的事情:

18/09/2011  20:02:55    org.springframework.web.servlet.handler.AbstractUrlHandlerMapping   INFO    Mapped URL path [/test] onto handler 'testController'
18/09/2011  20:02:55    org.springframework.web.servlet.handler.AbstractUrlHandlerMapping   INFO    Mapped URL path [/test] onto handler 'testController'

基本上什么都不做,<bean id="handlerMappings" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" /> 不再注册我的网址。

我需要为某些(第三方)控制器添加一个额外的处理程序映射,我无法对其进行注释,但在添加它时会破坏我的所有<context:component-scan>

这是正常的吗?一个bug? (我无法更改Spring版本)

我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

  

这是正常的吗?一个bug? (我无法更改Spring版本)

     

我错过了什么吗?

我遗失了一些东西:D。发现它隐藏在Spring的JavaDocs DefaultAnnotationHandlerMapping

  

注意:如果在DispatcherServlet上下文中定义自定义HandlerMapping bean,则需要显式添加DefaultAnnotationHandlerMapping bean,因为自定义HandlerMapping bean会替换默认的映射策略。

将此添加到我的配置XML中,现在一切正常:

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

答案 1 :(得分:0)

我不确定为什么您的注释Controller不再被提取,但我认为您的问题在于id您提供的SimpleUrlHandlerMapping。它应该是handlerMapping