In several places in the spring-webmvc module, URL patterns / objects
relationships are kept in `HashMap`s. When matching with actual URLs,
the algorithm uses a pattern comparator to sort the matching patterns
and select the most specific. But the underlying collection
implementation does not keep the original order which can lead to
inconsistencies.
This commit changes the underlying collection implementation to
`LinkedHashmap`s, in order to keep the insert order if the comparator
does not reorder entries.
Issue: SPR-13798
(cherry picked from commit 3be35c0)
pull/941/head
Brian Clozel10 years agocommitted byJuergen Hoeller
@ -55,7 +55,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@@ -55,7 +55,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@ -165,17 +165,17 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@@ -165,17 +165,17 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@ -198,14 +198,16 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@@ -198,14 +198,16 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@ -213,7 +215,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@@ -213,7 +215,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@ -222,12 +224,15 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
@@ -222,12 +224,15 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
continue;
}
if(logger.isTraceEnabled()){
logger.trace("Resolved public resource URL path=\""+resolved+"\"");
logger.trace("Resolved public resource URL path\""+resolved+"\"");
}
returnpathMapping+resolved;
}
}
logger.debug("No matching resource mapping");
if(logger.isDebugEnabled()){
logger.debug("No matching resource mapping for lookup path \""+lookupPath+"\"");
@ -58,7 +58,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@@ -58,7 +58,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@ -146,14 +146,14 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@@ -146,14 +146,14 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@ -164,14 +164,14 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@@ -164,14 +164,14 @@ public class VersionResourceResolver extends AbstractResourceResolver {
logger.trace("Resource matches extracted version ["+candidateVersion+"]");
}
returnbaseResource;
}
else{
if(logger.isTraceEnabled()){
logger.trace("Potential resource found for ["+requestPath+"], but version ["+
candidateVersion+"] doesn't match.");
logger.trace("Potential resource found for \""+requestPath+"\", but version ["+
candidateVersion+"] does not match");
}
returnnull;
}
@ -186,12 +186,12 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@@ -186,12 +186,12 @@ public class VersionResourceResolver extends AbstractResourceResolver {
returnnull;
}
if(logger.isTraceEnabled()){
logger.trace("Getting the original resource to determine version");
logger.trace("Getting the original resource to determine version for path \""+resourceUrlPath+"\"");
@ -204,17 +204,17 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@@ -204,17 +204,17 @@ public class VersionResourceResolver extends AbstractResourceResolver {