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

Ele*_*naT 5 java spring annotations controller spring-3

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

但是当我在XML配置中定义了处理程序映射时会出现问题.该@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";
    }
}
Run Code Online (Sandbox Code Playgroud)

以及以下配置:

<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>
Run Code Online (Sandbox Code Playgroud)

应用程序正常工作,URL /test已注册并正常工作.

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'
Run Code Online (Sandbox Code Playgroud)

但是如果我添加一个映射到XML的处理程序,它就不再起作用了.即使是这样简单的东西:

<bean id="handlerMappings" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" />
Run Code Online (Sandbox Code Playgroud)

这基本上什么都不做,并且<context:component-scan>不再注册我的URL.

我需要一些我无法注释的(第三方)控制器的额外处理程序映射,但是在添加它时它会破坏我@RequestMapping的所有.

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

我错过了什么吗?

Ele*_*naT 4

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

我错过了什么吗?

我错过了一些东西:D。发现这个隐藏在 Spring 的DefaultAnnotationHandlerMapping的 JavaDocs 中:

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

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

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
Run Code Online (Sandbox Code Playgroud)