5

我在控制器上使用带有注释的<context:component-scan>Spring 3.0.5。@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";
    }
}

和以下配置:

<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>

应用程序正常工作,并且 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'

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

<bean id="handlerMappings" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" />

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

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

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

我错过了什么吗?

4

2 回答 2

4

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

我错过了什么吗?

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

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

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

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
于 2011-09-18T20:03:32.593 回答
0

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

于 2011-09-18T19:02:18.360 回答