@ -27,6 +27,7 @@ import java.util.ArrayList;
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.Comparator ;
import java.util.HashMap ;
import java.util.LinkedHashMap ;
import java.util.LinkedHashSet ;
import java.util.List ;
@ -116,6 +117,7 @@ import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
@@ -116,6 +117,7 @@ import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException ;
import org.springframework.web.servlet.support.RequestContextUtils ;
import org.springframework.web.servlet.support.WebContentGenerator ;
import org.springframework.web.util.UriTemplate ;
import org.springframework.web.util.UrlPathHelper ;
import org.springframework.web.util.WebUtils ;
@ -587,7 +589,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
@@ -587,7 +589,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
if ( ! typeLevelPattern . startsWith ( "/" ) ) {
typeLevelPattern = "/" + typeLevelPattern ;
}
if ( isPathMatchInternal ( typeLevelPattern , lookupPath ) ) {
if ( getMatchingPattern ( typeLevelPattern , lookupPath ) ! = null ) {
if ( mappingInfo . matches ( request ) ) {
match = true ;
mappingInfo . addMatchedPattern ( typeLevelPattern ) ;
@ -695,8 +697,9 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
@@ -695,8 +697,9 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
typeLevelPattern = "/" + typeLevelPattern ;
}
String combinedPattern = pathMatcher . combine ( typeLevelPattern , methodLevelPattern ) ;
if ( isPathMatchInternal ( combinedPattern , lookupPath ) ) {
return combinedPattern ;
String matchingPattern = getMatchingPattern ( combinedPattern , lookupPath ) ;
if ( matchingPattern ! = null ) {
return matchingPattern ;
}
}
return null ;
@ -704,30 +707,30 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
@@ -704,30 +707,30 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
String bestMatchingPattern = ( String ) request . getAttribute ( HandlerMapping . BEST_MATCHING_PATTERN_ATTRIBUTE ) ;
if ( StringUtils . hasText ( bestMatchingPattern ) & & bestMatchingPattern . endsWith ( "*" ) ) {
String combinedPattern = pathMatcher . combine ( bestMatchingPattern , methodLevelPattern ) ;
if ( ! combinedPattern . equals ( bestMatchingPattern ) & &
( isPathMatchInternal ( combinedPattern , lookupPath ) ) ) {
return combined Pattern;
String matchingPattern = getMatchingPattern ( combinedPattern , lookupPath ) ;
if ( ( matchingPattern ! = null ) & & ! matchingPattern . equals ( bestMatchingPattern ) ) {
return matching Pattern;
}
}
if ( isPathMatchInternal ( methodLevelPattern , lookupPath ) ) {
return methodLevelPattern ;
}
return null ;
return getMatchingPattern ( methodLevelPattern , lookupPath ) ;
}
private boolean isPathMatchInternal ( String pattern , String lookupPath ) {
if ( pattern . equals ( lookupPath ) | | pathMatcher . match ( pattern , lookupPath ) ) {
return true ;
private String getMatchingPattern ( String pattern , String lookupPath ) {
if ( pattern . equals ( lookupPath ) ) {
return pattern ;
}
boolean hasSuffix = pattern . indexOf ( '.' ) ! = - 1 ;
if ( ! hasSuffix & & pathMatcher . match ( pattern + ".*" , lookupPath ) ) {
return true ;
return pattern + ".*" ;
}
if ( pathMatcher . match ( pattern , lookupPath ) ) {
return pattern ;
}
boolean endsWithSlash = pattern . endsWith ( "/" ) ;
if ( ! endsWithSlash & & pathMatcher . match ( pattern + "/" , lookupPath ) ) {
return true ;
return pattern + "/" ;
}
return false ;
return null ;
}
@SuppressWarnings ( "unchecked" )