New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Doc: <mvc:annotation-driven> incompatible to override strategy of handler mappings [SPR-6524] #11190

Closed
spring-issuemaster opened this Issue Dec 5, 2009 · 8 comments

Comments

Projects
None yet
1 participant
@spring-issuemaster
Copy link
Collaborator

spring-issuemaster commented Dec 5, 2009

Alex Rau opened SPR-6524 and commented

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


Affects: 3.0 RC2, 3.0 RC3

Reference URL: http://forum.springsource.org/showthread.php?p=272494

Issue Links:

  • #11070 Document new mvc namespace ("is superseded by")
@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 6, 2009

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.

Juergen

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 9, 2009

Keith Donald commented

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

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 9, 2009

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.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 9, 2009

Alex Rau commented

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 ?

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 15, 2009

Aleksander Adamowski commented

Keith, 3.0.GA is due today, and this and #11070 are the last two issues planned for the release.

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

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Dec 15, 2009

Mahesh Yamsani commented

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

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Jun 18, 2011

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.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Jun 20, 2011

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment