[SPR-6524] Doc: <mvc:annotation-driven> incompatible to override strategy of handler mappings Created: 05/Dec/09  Updated: 19/Jun/12  Resolved: 16/Dec/09

Status: Closed
Project: Spring Framework
Component/s: [Documentation], Web
Affects Version/s: 3.0 RC2, 3.0 RC3
Fix Version/s: 3.0 GA

Type: Task Priority: Major
Reporter: Alex Rau Assignee: Keith Donald
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Supersede
is superseded by SPR-6404 Document new mvc namespace Closed
Reference URL: http://forum.springsource.org/showthread.php?p=272494
Days since last comment: 7 years, 9 weeks, 3 days ago
Last commented by a User: false
Last updater: Trevor Marshall

 Description   

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:

1) declare in a web application context (e.g. using Spring's DispatcherServlet):

<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

<context:component-scan base-package="org.retroduction" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

2) declare a java controller using @Controller
3) start container with logging enabled and check logs for duplicate registration of the controller



 Comments   
Comment by Juergen Hoeller [ 06/Dec/09 ]

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.

Juergen

Comment by Keith Donald [ 09/Dec/09 ]

What do you need to customize that requires a custom DefaultAnnotationHandlerMapping instance?

Comment by Keith Donald [ 09/Dec/09 ]

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.

Comment by Alex Rau [ 09/Dec/09 ]

My instance needs 2 properties to be set:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="false"/>
<property name="interceptors">
<list>
<ref local="localeChangeInterceptor"/>
</list>
</property>
</bean>

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 ?

Comment by Aleksander Adamowski [ 15/Dec/09 ]

Keith, 3.0.GA is due today, and this and SPR-6404 are the last two issues planned for the release.

Half of the world is holding their breath, waiting for you to address these...

Comment by Mahesh Yamsani [ 15/Dec/09 ]

DM Server is waiting for Spring 3 release https://issuetracker.springsource.com/browse/DMS-2252

Comment by Marc Logemann [ 18/Jun/11 ]

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.

Comment by Rossen Stoyanchev [ 20/Jun/11 ]

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.

Generated at Thu Aug 16 17:34:47 UTC 2018 using JIRA 7.9.2#79002-sha1:3bb15b68ecd99a30eb364c4c1a393359bcad6278.