Fix issue with SpEL in mvc namespace

This change ensures that the location attribute of a resource mapping
and the path attribute of an interceptor mapping support SpEL
expressions.

Issue: SPR-9291, SPR-9848
This commit is contained in:
Rossen Stoyanchev 2012-11-13 21:06:49 -05:00
parent 950f00a280
commit 62f2858f7f
2 changed files with 23 additions and 18 deletions

View File

@ -21,6 +21,7 @@ import java.util.List;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.parsing.CompositeComponentDefinition; import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
@ -47,8 +48,8 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser {
mappedInterceptorDef.setSource(parserContext.extractSource(interceptor)); mappedInterceptorDef.setSource(parserContext.extractSource(interceptor));
mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String[] includePatterns = null; ManagedList<String> includePatterns = null;
String[] excludePatterns = null; ManagedList<String> excludePatterns = null;
Object interceptorBean; Object interceptorBean;
if ("interceptor".equals(interceptor.getLocalName())) { if ("interceptor".equals(interceptor.getLocalName())) {
includePatterns = getIncludePatterns(interceptor, "mapping"); includePatterns = getIncludePatterns(interceptor, "mapping");
@ -71,11 +72,11 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser {
return null; return null;
} }
private String[] getIncludePatterns(Element interceptor, String elementName) { private ManagedList<String> getIncludePatterns(Element interceptor, String elementName) {
List<Element> paths = DomUtils.getChildElementsByTagName(interceptor, elementName); List<Element> paths = DomUtils.getChildElementsByTagName(interceptor, elementName);
String[] patterns = new String[paths.size()]; ManagedList<String> patterns = new ManagedList<String>(paths.size());
for (int i = 0; i < paths.size(); i++) { for (int i = 0; i < paths.size(); i++) {
patterns[i] = paths.get(i).getAttribute("path"); patterns.add(paths.get(i).getAttribute("path"));
} }
return patterns; return patterns;
} }

View File

@ -22,6 +22,7 @@ import org.w3c.dom.Element;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
@ -87,10 +88,13 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
return null; return null;
} }
ManagedList<String> locations = new ManagedList<String>();
locations.addAll(StringUtils.commaDelimitedListToSet(locationAttr));
RootBeanDefinition resourceHandlerDef = new RootBeanDefinition(ResourceHttpRequestHandler.class); RootBeanDefinition resourceHandlerDef = new RootBeanDefinition(ResourceHttpRequestHandler.class);
resourceHandlerDef.setSource(source); resourceHandlerDef.setSource(source);
resourceHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); resourceHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
resourceHandlerDef.getPropertyValues().add("locations", StringUtils.commaDelimitedListToStringArray(locationAttr)); resourceHandlerDef.getPropertyValues().add("locations", locations);
String cacheSeconds = element.getAttribute("cache-period"); String cacheSeconds = element.getAttribute("cache-period");
if (StringUtils.hasText(cacheSeconds)) { if (StringUtils.hasText(cacheSeconds)) {