@ -178,7 +178,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
@@ -178,7 +178,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
rawHandler = getApplicationContext ( ) . getBean ( handlerName ) ;
}
validateHandler ( rawHandler , request ) ;
handler = buildPathExposingHandler ( rawHandler , lookupPath , null ) ;
handler = buildPathExposingHandler ( rawHandler , lookupPath , lookupPath , null ) ;
}
}
if ( handler ! = null & & logger . isDebugEnabled ( ) ) {
@ -213,35 +213,35 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
@@ -213,35 +213,35 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
handler = getApplicationContext ( ) . getBean ( handlerName ) ;
}
validateHandler ( handler , request ) ;
return buildPathExposingHandler ( handler , urlPath , null ) ;
return buildPathExposingHandler ( handler , urlPath , urlPath , null ) ;
}
// Pattern match?
List < String > matchingPath s = new ArrayList < String > ( ) ;
for ( String registeredPath : this . handlerMap . keySet ( ) ) {
if ( getPathMatcher ( ) . match ( registeredPath , urlPath ) ) {
matchingPath s . add ( registeredPath ) ;
List < String > matchingPattern s = new ArrayList < String > ( ) ;
for ( String registeredPattern : this . handlerMap . keySet ( ) ) {
if ( getPathMatcher ( ) . match ( registeredPattern , urlPath ) ) {
matchingPattern s . add ( registeredPattern ) ;
}
}
String bestPath Match = null ;
if ( ! matchingPath s . isEmpty ( ) ) {
Collections . sort ( matchingPath s , getPathMatcher ( ) . getPatternComparator ( urlPath ) ) ;
String bestPattern Match = null ;
if ( ! matchingPattern s . isEmpty ( ) ) {
Collections . sort ( matchingPattern s , getPathMatcher ( ) . getPatternComparator ( urlPath ) ) ;
if ( logger . isDebugEnabled ( ) ) {
logger . debug ( "Matching path for request [" + urlPath + "] are " + matchingPath s ) ;
logger . debug ( "Matching patterns for request [" + urlPath + "] are " + matchingPattern s ) ;
}
bestPathMatch = matchingPath s . get ( 0 ) ;
bestPatternMatch = matchingPattern s . get ( 0 ) ;
}
if ( bestPath Match ! = null ) {
handler = this . handlerMap . get ( bestPath Match ) ;
if ( bestPattern Match ! = null ) {
handler = this . handlerMap . get ( bestPattern Match ) ;
// Bean name or resolved handler?
if ( handler instanceof String ) {
String handlerName = ( String ) handler ;
handler = getApplicationContext ( ) . getBean ( handlerName ) ;
}
validateHandler ( handler , request ) ;
String pathWithinMapping = getPathMatcher ( ) . extractPathWithinPattern ( bestPath Match , urlPath ) ;
String pathWithinMapping = getPathMatcher ( ) . extractPathWithinPattern ( bestPattern Match , urlPath ) ;
Map < String , String > uriTemplateVariables =
getPathMatcher ( ) . extractUriTemplateVariables ( bestPath Match , urlPath ) ;
return buildPathExposingHandler ( handler , pathWithinMapping , uriTemplateVariables ) ;
getPathMatcher ( ) . extractUriTemplateVariables ( bestPattern Match , urlPath ) ;
return buildPathExposingHandler ( handler , bestPatternMatch , pathWithinMapping , uriTemplateVariables ) ;
}
// No handler found...
return null ;
@ -269,11 +269,13 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
@@ -269,11 +269,13 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
* @param uriTemplateVariables the URI template variables , can be < code > null < / code > if no variables found
* @return the final handler object
* /
protected Object buildPathExposingHandler (
Object rawHandler , String pathWithinMapping , Map < String , String > uriTemplateVariables ) {
protected Object buildPathExposingHandler ( Object rawHandler ,
String bestMatchingPattern ,
String pathWithinMapping ,
Map < String , String > uriTemplateVariables ) {
HandlerExecutionChain chain = new HandlerExecutionChain ( rawHandler ) ;
chain . addInterceptor ( new PathExposingHandlerInterceptor ( pathWithinMapping ) ) ;
chain . addInterceptor ( new PathExposingHandlerInterceptor ( bestMatchingPattern , pathWithinMapping ) ) ;
if ( ! CollectionUtils . isEmpty ( uriTemplateVariables ) ) {
chain . addInterceptor ( new UriTemplateVariablesHandlerInterceptor ( uriTemplateVariables ) ) ;
}
@ -286,7 +288,8 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
@@ -286,7 +288,8 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
* @param request the request to expose the path to
* @see # PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE
* /
protected void exposePathWithinMapping ( String pathWithinMapping , HttpServletRequest request ) {
protected void exposePathWithinMapping ( String bestMatchingPattern , String pathWithinMapping , HttpServletRequest request ) {
request . setAttribute ( HandlerMapping . BEST_MATCHING_PATTERN_ATTRIBUTE , bestMatchingPattern ) ;
request . setAttribute ( HandlerMapping . PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE , pathWithinMapping ) ;
}
@ -384,15 +387,18 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
@@ -384,15 +387,18 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
* /
private class PathExposingHandlerInterceptor extends HandlerInterceptorAdapter {
private final String bestMatchingPattern ;
private final String pathWithinMapping ;
private PathExposingHandlerInterceptor ( String pathWithinMapping ) {
private PathExposingHandlerInterceptor ( String bestMatchingPattern , String pathWithinMapping ) {
this . bestMatchingPattern = bestMatchingPattern ;
this . pathWithinMapping = pathWithinMapping ;
}
@Override
public boolean preHandle ( HttpServletRequest request , HttpServletResponse response , Object handler ) {
exposePathWithinMapping ( this . pathWithinMapping , request ) ;
exposePathWithinMapping ( this . bestMatchingPattern , this . pathWithinMapping , request ) ;
return true ;
}
}