Skip to content

Commit

Permalink
Add detectHandlerMethodsInAncestorContexts property to AbstractHandle…
Browse files Browse the repository at this point in the history
…rMethodMapping.

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@5178 50f2f4bb-b051-0410-bef5-90022cba6387
  • Loading branch information
rstoyanchev committed Nov 23, 2011
1 parent 024cce2 commit 9eb6f9b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.context.ApplicationContextException;
import org.springframework.util.ClassUtils;
import org.springframework.util.LinkedMultiValueMap;
Expand All @@ -52,10 +53,24 @@
*/
public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping {

private boolean detectHandlerMethodsInAncestorContexts = false;

private final Map<T, HandlerMethod> handlerMethods = new LinkedHashMap<T, HandlerMethod>();

private final MultiValueMap<String, T> urlMap = new LinkedMultiValueMap<String, T>();

/**
* Whether to detect handler methods in beans in ancestor ApplicationContexts.
* <p>Default is "false": Only beans in the current ApplicationContext are
* considered, i.e. only in the context that this HandlerMapping itself
* is defined in (typically the current DispatcherServlet's context).
* <p>Switch this flag on to detect handler beans in ancestor contexts
* (typically the Spring root WebApplicationContext) as well.
*/
public void setDetectHandlerMethodsInAncestorContexts(boolean detectHandlerMethodsInAncestorContexts) {
this.detectHandlerMethodsInAncestorContexts = detectHandlerMethodsInAncestorContexts;
}

/**
* Return a map with all handler methods and their mappings.
*/
Expand All @@ -82,7 +97,12 @@ protected void initHandlerMethods() {
if (logger.isDebugEnabled()) {
logger.debug("Looking for request mappings in application context: " + getApplicationContext());
}
for (String beanName : getApplicationContext().getBeanNamesForType(Object.class)) {

String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ?
BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
getApplicationContext().getBeanNamesForType(Object.class));

for (String beanName : beanNames) {
if (isHandler(getApplicationContext().getType(beanName))){
detectHandlerMethods(beanName);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,12 @@

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.StaticApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.util.UrlPathHelper;

Expand Down Expand Up @@ -88,6 +91,24 @@ public void ambiguousMatch() throws Exception {
mapping.getHandlerInternal(new MockHttpServletRequest("GET", "/foo"));
}

@Test
public void testDetectHandlerMethodsInAncestorContexts() {
StaticApplicationContext cxt = new StaticApplicationContext();
cxt.registerSingleton("myHandler", MyHandler.class);

AbstractHandlerMethodMapping<String> mapping1 = new MyHandlerMethodMapping();
mapping1.setApplicationContext(new StaticApplicationContext(cxt));

assertEquals(0, mapping1.getHandlerMethods().size());

AbstractHandlerMethodMapping<String> mapping2 = new MyHandlerMethodMapping();
mapping2.setDetectHandlerMethodsInAncestorContexts(true);
mapping2.setApplicationContext(new StaticApplicationContext(cxt));

assertEquals(2, mapping2.getHandlerMethods().size());
}


private static class MyHandlerMethodMapping extends AbstractHandlerMethodMapping<String> {

private UrlPathHelper pathHelper = new UrlPathHelper();
Expand Down Expand Up @@ -123,13 +144,14 @@ protected Set<String> getMappingPathPatterns(String key) {
}
}

private static class MyHandler {
@Controller
static class MyHandler {

@SuppressWarnings("unused")
@RequestMapping
public void handlerMethod1() {
}

@SuppressWarnings("unused")
@RequestMapping
public void handlerMethod2() {
}
}
Expand Down

0 comments on commit 9eb6f9b

Please sign in to comment.