我在我的控制器上使用带有<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版本)
我错过了什么吗?
答案 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
。