diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java index 6c81fd8865..a82d1f826f 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java @@ -170,6 +170,11 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { rawHandler = getDefaultHandler(); } if (rawHandler != null) { + // Bean name or resolved handler? + if (rawHandler instanceof String) { + String handlerName = (String) rawHandler; + rawHandler = getApplicationContext().getBean(handlerName); + } validateHandler(rawHandler, request); handler = buildPathExposingHandler(rawHandler, lookupPath, null); } @@ -200,6 +205,11 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { // Direct match? Object handler = this.handlerMap.get(urlPath); if (handler != null) { + // Bean name or resolved handler? + if (handler instanceof String) { + String handlerName = (String) handler; + handler = getApplicationContext().getBean(handlerName); + } validateHandler(handler, request); return buildPathExposingHandler(handler, urlPath, null); } @@ -213,6 +223,11 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { } if (bestPathMatch != null) { handler = this.handlerMap.get(bestPathMatch); + // Bean name or resolved handler? + if (handler instanceof String) { + String handlerName = (String) handler; + handler = getApplicationContext().getBean(handlerName); + } validateHandler(handler, request); String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPathMatch, urlPath); Map uriTemplateVariables = @@ -248,11 +263,6 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { protected Object buildPathExposingHandler( Object rawHandler, String pathWithinMapping, Map uriTemplateVariables) { - // Bean name or resolved handler? - if (rawHandler instanceof String) { - String handlerName = (String) rawHandler; - rawHandler = getApplicationContext().getBean(handlerName); - } HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler); chain.addInterceptor(new PathExposingHandlerInterceptor(pathWithinMapping)); if (!CollectionUtils.isEmpty(uriTemplateVariables)) { @@ -353,7 +363,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { * as value. * @see #getDefaultHandler() */ - public final Map getHandlerMap() { + public final Map getHandlerMap() { return Collections.unmodifiableMap(this.handlerMap); } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/DefaultAnnotationHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/DefaultAnnotationHandlerMapping.java index e7a858cb8e..797e1735f1 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/DefaultAnnotationHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/DefaultAnnotationHandlerMapping.java @@ -30,6 +30,7 @@ import org.springframework.stereotype.Controller; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.UnsatisfiedServletRequestParameterException; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -186,11 +187,9 @@ public class DefaultAnnotationHandlerMapping extends AbstractDetectingUrlHandler */ @Override protected void validateHandler(Object handler, HttpServletRequest request) throws Exception { - Class handlerClass = (handler instanceof String ? - getApplicationContext().getType((String) handler) : handler.getClass()); - RequestMapping mapping = this.cachedMappings.get(handlerClass); + RequestMapping mapping = this.cachedMappings.get(handler.getClass()); if (mapping == null) { - mapping = AnnotationUtils.findAnnotation(handlerClass, RequestMapping.class); + mapping = AnnotationUtils.findAnnotation(handler.getClass(), RequestMapping.class); } if (mapping != null) { validateMapping(mapping, request); @@ -218,6 +217,13 @@ public class DefaultAnnotationHandlerMapping extends AbstractDetectingUrlHandler if (!ServletAnnotationMappingUtils.checkParameters(mappedParams, request)) { throw new UnsatisfiedServletRequestParameterException(mappedParams, request.getParameterMap()); } + + String[] mappedHeaders = mapping.headers(); + if (!ServletAnnotationMappingUtils.checkHeaders(mappedHeaders, request)) { + throw new ServletRequestBindingException("Header conditions \"" + + StringUtils.arrayToDelimitedString(mappedHeaders, ", ") + + "\" not met for actual request"); + } } }