I use filenames in my REST API (example: GET http://xxx/api/myImage.jpg) problem is @PathVariable dropped ".jpg". this problems already asked few times in here and answered. but not worked to me.
so I searched then found at the
https://jira.springsource.org/browse/SPR-6524
"... is simply not supposed to be combined with manual DefaultAnnotationHandlerMapping instances; this is designed as an either-or choice at present, quite similar to and ."
"mvc namespace are make simplifed configurations".
Real question is mvc what does do? and changed?
I found my self these things..
- intercepter configuration changed. (mvc namspace required in bean configuation)
- useDefaultSuffixPattern is not working.
- adds JSON message converter. if jackson library is available
- @PathVariable arguments are auto added to model
Any others?
Thanks in advance!
To enable MVC Java config add the annotation @EnableWebMvc to one of your @Configuration classes:
To achieve the same in XML use the mvc:annotation-driven element in your DispatcherServlet context (or in your root context if you have no DispatcherServlet context defined):
The above registers a RequestMappingHandlerMapping, a RequestMappingHandlerAdapter, and an ExceptionHandlerExceptionResolver (among others) in support of processing requests with annotated controller methods using annotations such as @RequestMapping, @ExceptionHandler, and others.
For details refer the below link :
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config
mvc:annotation-driven tag do extra work from context:component-scan tag
The tag registers the Handler Mapping and Handler Adapter required to dispatch requests to your @Controllers:
tag helps registering the following components.
DefaultAnnotationHandlerMapping - This is a HandlerMapping implementation which maps the HTTP requests to the handler methods defined using the @RequestMapping annotation.
AnnotationMethodHandlerAdapter - It is responsible for scanning the controllers to identify methods (and parameters) annotated with @MVC annotations. It scans and caches handler methods annotated with @RequestMapping. Also handles the @RequestParam, @ModelAttribute, @SessionAttributes and @InitBinder annotations.
ConfigurableWebBindingInitializer - The initializer for the Web Data Binder. Helps in declaratively configuring the Web Binder with validators, conversion services, property editors, etc.
LocalValidatorFactoryBean - Implements the validator interface and enables JSR303 validation. This is injected into ConfigurableWebBindingInitializer. FormattingConversionServiceFactoryBean - A conversion factory that returns conversion services for basic objects like date and numbers. This factory is again injected into ConfigurableWebBindingInitializer.
Message Converters
ByteArrayHttpMessageConverter - A HTTP request message converter that reads a HTTP message body and returns a byte stream. It can also read a byte stream and construct a response body. Used for receiving and sending documents like PDF, XLS, etc.
StringHttpMessageConverter - A HTTP request message converter that reads a plain text request body and binds it to a String object. And vice-versa with response.
FormHttpMessageConverter - A HTTP request message converter that reads a form encoded request body and binds it to a form Binding object.
SourceHttpMessageConverter - A HTTP request converter that converts a XML message body to/from Binding Object.
If we do not use mvc:annotation-driven tag then we have to do register these components manually in xml file in order to use them , which results in too much extra work.
The
mvc:annotationDriven
tag essentially sets you your Spring context to allow for dispatching requests to Controllers.The tag will configure two beans DefaultAnnotationHandlerMapping and AnnotationMethodHandlerAdapter.
You can find more information from the spring documents:
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html
Before I provide certain points let me clear up the answer provided by Roy is not accurate. You don't have to provide
mvc:annotation-driven
tag to instantiate default beans. This tag can be usedSpring 3.0+
to enable new feature introduced from Spring 3.0(Do not use it if you want backward compatibility, especially if you are using old controller based classes like
MultiActionController
,SimpleFormController
)Now lets come to what this tag actually does -
Prior to Spring 3.1 default beans used where
These are deprecated in Spring 3.1 and if you use above mentioned tag it will be replaced by -
There are other infrastructure beans that are instantiated by these tag (chained in addition to defaults) like -
MappedInterceptor
,ConfigurableWebBindingInitializer
,SessionFlashManager
,ContentNegociationManager
etc. I am not going to explain these :) as they each are long answers themselves, so google it for more info.PS : And yes Spring 3.1+ automatically expose @PathVariables to the model. Also you have
mvc:interceptors
tag. But I think it is not related to<mvc:annotation-driven />
. I would highly recommend read - http://spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0/