Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.Sign up
Doc: <mvc:annotation-driven> incompatible to override strategy of handler mappings [SPR-6524] #11190
the mvc:annotation-driven feature breaks or at least does not conform to the implemented strategy in MVC that there is an implicit DefaultAnnotationHandlerMapping (D1) which can be replaced with custom parameterized versions (D2) of handler mappings.
As soon as someone wants to use the above short-cut "mvc:annotation-driven" there will be a DefaultAnnotationHandlerMapping (D3) which a) cannot be replaced with a custom version (D2) anymore and b) replaces the implicit one (D1). Even worse - developers declaring (D3) assuming they would override the implicit one (D1) will end up with two instances of DefaultAnnotationHandlerMapping (D2 and D3) resulting in duplicate registration of annotated controllers (component scan) and custom parameterization which will be without any effect as D2 seems to win over D3.
I think at least a dedicated property for the above declaration should be defined which allows passing in a custom DefaultAnnotationHandlerMapping along with the declaration (+ some clarifying documentation about this wouldn't be too bad).
Steps to reproduce:
Affects: 3.0 RC2, 3.0 RC3
Reference URL: http://forum.springsource.org/showthread.php?p=272494
Juergen Hoeller commented
This is an intended effect to some degree: mvc:annotation-driven is simply not supposed to be combined with manual DefaultAnnotationHandlerMapping instances; this is designed as an either-or choice at present, quite similar to context:annotation-config and tx:annotation-driven.
I'll quickly revisit this for GA, even if we might eventually stick with the current behavior as-is.
Keith Donald commented
Will address for GA as a Documentation issue. Users have an either-or choice here: either use the mvc namespace and its simplified configuration, or "unroll" to use bean-style config. We don't want to introduce complexity into the namespace options where we can help it--adding support for a custom handler mapping instance exposes complexity.
Agreed though docs need to be better so this ticket will address that.
Alex Rau commented
My instance needs 2 properties to be set:
I see Juergen's point and I'm ok with the current state/behaviour. However I think it's a little bit a pitfall without additional/clear documentation what mvc:annotation-driven does under the hood (like in my case the hidden definition of a DefaultAnnotationHandlerMapping which magically kills an explicitly declared one). And my investigation stopped with reading the XSD...
I'm not yet used to these kind of short-cut declarations (but in general I like them to be honest). My workaround right now is just unrolling the short-cut manually.
Beside the documentation aspect perhaps a nice idea would be adding an optional parameter to the declaration for the handler mapping ?
Marc Logemann commented
What was the solution for this issue since its marked as fixed?
I also spent 3 hours debugging spring code just to see that there is some kind of conflict between custom DefaultAnnotationHandlerMapping and annotation-driven.
I personally need the alwaysUseFullPath = true and i still want to use annotations for defining controllers.
Rossen Stoyanchev commented
Hi Marc, I believe the solution was to clarify the documentation. Just one quick note on the code-based configuration for Spring MVC available in Spring 3.1. It provides the equivalent of mvc:annotation-driven as well as an option to modify the resulting beans. See this post. If you wanted to give it a try you will need to use 3.1.0.BUILD-SNAPSHOT rather than the M2 release.