我在REST API中使用文件名(例如:GET http://xxx/api/myImage.jpg) 问题是@PathVariable掉了“.jpg”。 这个问题已经在这里问过几次并回答了。但对我不起作用。
所以我搜索了
然后找到了https://jira.springsource.org/browse/SPR-6524
“......根本不应该与手动DefaultAnnotationHandlerMapping实例结合使用;这被设计为目前的一种或两种选择,非常类似于和。”
“mvc名称空间是简化配置”。
真正的问题是mvc做了什么?并改变了?
我发现了自己的这些东西..
还有其他人吗?
提前致谢!
答案 0 :(得分:12)
mvc:annotationDriven
标记实际上为您设置了Spring上下文,以允许将请求分派给控制器。
标记将配置两个bean DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。
您可以从spring文档中找到更多信息:
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html
答案 1 :(得分:7)
要启用MVC Java配置,请将 @EnableWebMvc 注释添加到 @Configuration 类之一:
@Configuration
@EnableWebMvc
public class WebConfig {
}
在XML中实现相同的使用 的 MVC:注解驱动强> DispatcherServlet上下文中的元素(如果没有定义DispatcherServlet上下文,则在根上下文中):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven/>
</beans>
上面注册了一个 RequestMappingHandlerMapping ,一个 RequestMappingHandlerAdapter 和一个 ExceptionHandlerExceptionResolver (以及其他),以支持使用带注释的控制器方法处理请求注释,例如 @RequestMapping,@ ExceptionHandler 等。
有关详细信息,请参阅以下链接:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config
答案 2 :(得分:7)
在我提供某些要点之前让我清楚一下Roy提供的答案并不准确。您不必提供mvc:annotation-driven
标记来实例化默认bean。可以使用此标记Spring 3.0+
启用从Spring 3.0引入的新功能
(如果您想要向后兼容,请不要使用它,特别是如果您使用的是基于控制器的旧类,如MultiActionController
,SimpleFormController
)
现在让我们来看看这个标签实际上做了什么 -
在Spring 3.1之前使用默认bean
在Spring 3.1中不推荐使用它们,如果使用上面提到的标记,它将被 -
替换DefaultAnnotationHandlerMapping决定使用哪个控制器,AnnotationMethodHandlerAdapter选择处理请求的实际方法。 RequestMappingHandlerMapping执行这两项任务。因此,请求直接映射到方法。
还有其他基础架构bean通过这些标记进行实例化(除了默认值链接),例如 - MappedInterceptor
,ConfigurableWebBindingInitializer
,SessionFlashManager
,{{ 1}}等我不打算解释这些:)因为它们每个都是很长的答案,所以谷歌它的更多信息。
PS:是的,Spring 3.1+会自动将@PathVariables暴露给模型。你还有ContentNegociationManager
标签。但我认为这与mvc:interceptors
无关。我强烈推荐阅读 - http://spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0/
答案 3 :(得分:0)
mvc:annotation-driven标签从context:component-scan tag
做额外的工作标记会注册将请求发送到@Controllers所需的处理程序映射和处理程序适配器:
标签有助于注册以下组件。
DefaultAnnotationHandlerMapping - 这是一个HandlerMapping实现,它将HTTP请求映射到使用@RequestMapping批注定义的处理程序方法。
AnnotationMethodHandlerAdapter - 负责扫描控制器以识别使用@MVC注释注释的方法(和参数)。它扫描并缓存使用@RequestMapping注释的处理程序方法。还处理@RequestParam,@ ModelAttribute,@ SessionAttributes和@InitBinder注释。
ConfigurableWebBindingInitializer - Web数据绑定器的初始化程序。帮助声明性地使用验证器,转换服务,属性编辑器等配置Web Binder。
LocalValidatorFactoryBean - 实现验证器接口并启用JSR303验证。这将注入ConfigurableWebBindingInitializer。 FormattingConversionServiceFactoryBean - 一个转换工厂,它返回日期和数字等基本对象的转换服务。这个工厂再次注入ConfigurableWebBindingInitializer。
邮件转换器
ByteArrayHttpMessageConverter - 一个HTTP请求消息转换器,它读取HTTP消息体并返回字节流。它还可以读取字节流并构造响应主体。用于接收和发送PDF,XLS等文件。
StringHttpMessageConverter - 一个HTTP请求消息转换器,它读取纯文本请求正文并将其绑定到String对象。反之亦然
FormHttpMessageConverter - 一个HTTP请求消息转换器,它读取表单编码的请求正文并将其绑定到表单绑定对象。
SourceHttpMessageConverter - 一个HTTP请求转换器,用于将XML消息体转换为绑定对象或从绑定对象转换。
如果我们不使用mvc:annotation-driven标签,那么我们必须在xml文件中手动注册这些组件才能使用它们,这会导致额外的工作量过多。