Add detectHandlerMethodsInAncestorContexts property to AbstractHandlerMethodMapping.
This commit is contained in:
parent
b5bcfa0ae3
commit
ca3d774f5c
|
|
@ -27,6 +27,7 @@ import java.util.Set;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.BeanFactoryUtils;
|
||||||
import org.springframework.context.ApplicationContextException;
|
import org.springframework.context.ApplicationContextException;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
|
|
@ -52,10 +53,24 @@ import org.springframework.web.servlet.HandlerMapping;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping {
|
public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping {
|
||||||
|
|
||||||
|
private boolean detectHandlerMethodsInAncestorContexts = false;
|
||||||
|
|
||||||
private final Map<T, HandlerMethod> handlerMethods = new LinkedHashMap<T, HandlerMethod>();
|
private final Map<T, HandlerMethod> handlerMethods = new LinkedHashMap<T, HandlerMethod>();
|
||||||
|
|
||||||
private final MultiValueMap<String, T> urlMap = new LinkedMultiValueMap<String, T>();
|
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.
|
* Return a map with all handler methods and their mappings.
|
||||||
*/
|
*/
|
||||||
|
|
@ -82,7 +97,12 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.debug("Looking for request mappings in application context: " + getApplicationContext());
|
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))){
|
if (isHandler(getApplicationContext().getType(beanName))){
|
||||||
detectHandlerMethods(beanName);
|
detectHandlerMethods(beanName);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,12 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.springframework.context.support.StaticApplicationContext;
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
import org.springframework.mock.web.MockHttpServletRequest;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
import org.springframework.util.PathMatcher;
|
import org.springframework.util.PathMatcher;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.method.HandlerMethod;
|
||||||
import org.springframework.web.util.UrlPathHelper;
|
import org.springframework.web.util.UrlPathHelper;
|
||||||
|
|
||||||
|
|
@ -88,6 +91,24 @@ public class HandlerMethodMappingTests {
|
||||||
mapping.getHandlerInternal(new MockHttpServletRequest("GET", "/foo"));
|
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 static class MyHandlerMethodMapping extends AbstractHandlerMethodMapping<String> {
|
||||||
|
|
||||||
private UrlPathHelper pathHelper = new UrlPathHelper();
|
private UrlPathHelper pathHelper = new UrlPathHelper();
|
||||||
|
|
@ -123,13 +144,14 @@ public class HandlerMethodMappingTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class MyHandler {
|
@Controller
|
||||||
|
static class MyHandler {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@RequestMapping
|
||||||
public void handlerMethod1() {
|
public void handlerMethod1() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@RequestMapping
|
||||||
public void handlerMethod2() {
|
public void handlerMethod2() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue