2011-11-17 53 views
12

我在我的REST API中使用文件名(例如:GET http://xxx/api/myImage.jpg) 问题是@PathVariable掉落“.jpg”。 这个问题已经在这里问了几次并回答了。但不适合我。<mvc:annotation-driven />做了什么?

所以我搜索然后发现在

https://jira.springsource.org/browse/SPR-6524

” ...是简单地不应该具有手动DefaultAnnotationHandlerMapping实例进行组合;这被设计为非此即彼目前选择,非常相似到和“。

“mvc命名空间是简化的配置”。

真正的问题是mvc有什么用?并改变了?

,我发现我自己这些东西..

  1. 截击配置改变。 (在bean配置中需要mvc namspace)
  2. useDefaultSuffixPattern不起作用。
  3. 添加了JSON消息转换器。如果杰克逊库可
  4. @PathVariable参数是自动添加到模型

任何其他方面?

在此先感谢!

回答

11

mvc:annotationDriven标记本质上为您设置了您的Spring上下文以允许将请求分派给控制器。

该标签将配置两个Bean DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

您可以找到春天文档的详细信息:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

+3

从Spring 3.1,配置豆RequestMappingHandlerMapping和RequestMappingHandlerAdapter –

+0

这个答案是不完全正确的。默认的处理程序映射豆'BeanNameUrlHandlerMapping'和'DefaultAnnotationHandlerMapping'和违约处理程序适配器豆'HttpRequestHandlerAdapter','SimpleControllerHandlerAdapter'和'AnnotationMethodHandlerAdapter'总是创建不论您提供'MVC:annotationDriven'标签或不[文件](HTTP:/ /docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html)。 –

5

要启用MVC的Java配置中添加注释@EnableWebMvc@Configuration的一类:

@Configuration 
@EnableWebMvc 
public class WebConfig { 

} 

要在XML中实现相同的目的,请使用 mvc:annotation-dr在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,一个RequestMappingHandlerAdapterExceptionHandlerExceptionResolver(间其他)支持使用注释控制器方法处理请求,例如@RequestMapping,@ExceptionHandler等。

,详见以下链接:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config

6

之前我提供某些点让我明确了由罗伊提供的答案是不准确的。您不必提供mvc:annotation-driven标签来实例化默认bean。这个标签可以用来Spring 3.0+使从春季3.0

如果你想向后兼容性,不要使用它,特别是如果你使用的是像MultiActionController旧控制器,基于类,SimpleFormController

现在推出的新功能让来这是什么标签实际上做 -

此前使用过Spring 3.1默认豆其中

  1. DefaultAnnotationHandlerMap平
  2. AnnotationMethodHandlerAdapter上
  3. AnnotationMethodHandlerExceptionResolver

这些被弃用春季3.1,如果你使用上面提到的标签将被替换 -

  1. RequestMappingHandlerMapping
  2. RequestMappingHandlerAdapter
  3. ExceptionHandlerExceptionResolver

DefaultAnnotationHandlerMapping决定使用哪个控制器并且AnnotationMethodHandlerAdapter选择处理请求的实际方法。 RequestMappingHandlerMapping执行这两项任务。因此该请求直接映射到该方法。

有被这些标签(除了默认链接)实例化等基础设施豆状 - MappedInterceptorConfigurableWebBindingInitializerSessionFlashManagerContentNegociationManager等我不打算解释这些:),因为他们每一个都是很长的答案本身,所以谷歌它的更多信息。

PS:是的,Spring 3.1+自动将@PathVariables暴露给模型。你也有mvc:interceptors标签。但我认为这与<mvc:annotation-driven />无关。我会强烈建议阅读 - http://spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0/

0

MVC:注解驱动的标签做从上下文中额外的工作:组件扫描标签

标签注册处理程序映射将请求分派到所需的处理程序适配器您@控制器:

标签帮助注册以下组件。

DefaultAnnotationHandlerMapping - 这是一个HandlerMapping实现,它将HTTP请求映射到使用@RequestMapping注释定义的处理程序方法。

AnnotationMethodHandlerAdapter - 它负责扫描控制器以识别使用@MVC标注注释的方法(和参数)。它扫描和缓存用@RequestMapping注解的处理程序方法。还处理@RequestParam,@ModelAttribute,@SessionAttributes和@InitBinder注释。

ConfigurableWebBindingInitializer - Web Data Binder的初始值设定项。帮助以声明方式配置验证器,转换服务,属性编辑器等Web活页夹。

LocalValidatorFactoryBean - 实现验证器接口并启用JSR303验证。这被注入到ConfigurableWebBindingInitializer中。 FormattingConversionServiceFactoryBean - 为基本对象(如日期和数字)返回转换服务的转换工厂。该工厂再次注入到ConfigurableWebBindingInitializer中。

消息转换器
ByteArrayHttpMessageConverter - 甲HTTP请求消息转换器,其读取HTTP消息主体,并返回一个字节流。它也可以读取一个字节流并构造一个响应体。用于接收和发送,如PDF,XLS等文件
StringHttpMessageConverter - 甲HTTP请求消息转换器,其读取明文请求主体并将其绑定到一个字符串对象。反之亦然。
FormHttpMessageConverter - 甲HTTP请求消息转换器,其读取形式编码的请求体并将其绑定到一个形式绑定对象。
SourceHttpMessageConverter - 一个HTTP请求转换器,用于将XML消息体转换为绑定对象。

如果我们不使用MVC:注解驱动的标签,然后我们要做的xml文件中手动注册这些组件,以使用它们,这会导致过多的额外工作。

相关问题