diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index 49d7ff0ff5..acfe52e0ee 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java @@ -31,6 +31,7 @@ import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.Ordered; import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter; import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; @@ -108,10 +109,46 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { resourceHandlerDef.getPropertyValues().add("cacheSeconds", cacheSeconds); } + ManagedList resourceResolvers = parseResourceResolvers(parserContext, element, source); + if(!resourceResolvers.isEmpty()) { + resourceHandlerDef.getPropertyValues().add("resourceResolvers", resourceResolvers); + } + + ManagedList resourceTransformers = parseResourceTransformers(parserContext, element, source); + if(!resourceTransformers.isEmpty()) { + resourceHandlerDef.getPropertyValues().add("resourceTransformers", resourceTransformers); + } + String beanName = parserContext.getReaderContext().generateBeanName(resourceHandlerDef); parserContext.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef); parserContext.registerComponent(new BeanComponentDefinition(resourceHandlerDef, beanName)); return beanName; } + private ManagedList parseResourceResolvers(ParserContext parserContext, Element element, Object source) { + Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers"); + ManagedList resourceResolvers = new ManagedList(); + if (resolversElement != null) { + resourceResolvers.setSource(source); + for (Element beanElement : DomUtils.getChildElementsByTagName(resolversElement, "bean", "ref")) { + Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null); + resourceResolvers.add(object); + } + } + return resourceResolvers; + } + + private ManagedList parseResourceTransformers(ParserContext parserContext, Element element, Object source) { + Element transformersElement = DomUtils.getChildElementByTagName(element, "transformers"); + ManagedList resourceTransformers = new ManagedList(); + if (transformersElement != null) { + resourceTransformers.setSource(source); + for (Element beanElement : DomUtils.getChildElementsByTagName(transformersElement, "bean", "ref")) { + Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null); + resourceTransformers.add(object); + } + } + return resourceTransformers; + } + } diff --git a/spring-webmvc/src/main/resources/META-INF/spring.schemas b/spring-webmvc/src/main/resources/META-INF/spring.schemas index 2edcf7874d..c42a8b37ff 100644 --- a/spring-webmvc/src/main/resources/META-INF/spring.schemas +++ b/spring-webmvc/src/main/resources/META-INF/spring.schemas @@ -2,4 +2,5 @@ http\://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd=org/springframewor http\://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd=org/springframework/web/servlet/config/spring-mvc-3.1.xsd http\://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd=org/springframework/web/servlet/config/spring-mvc-3.2.xsd http\://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd=org/springframework/web/servlet/config/spring-mvc-4.0.xsd -http\://www.springframework.org/schema/mvc/spring-mvc.xsd=org/springframework/web/servlet/config/spring-mvc-4.0.xsd +http\://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd=org/springframework/web/servlet/config/spring-mvc-4.1.xsd +http\://www.springframework.org/schema/mvc/spring-mvc.xsd=org/springframework/web/servlet/config/spring-mvc-4.1.xsd diff --git a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd new file mode 100644 index 0000000000..ad1cd6ab5a --- /dev/null +++ b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd @@ -0,0 +1,578 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java index ae84f94465..0696ef5d50 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java @@ -24,6 +24,7 @@ import java.util.*; import javax.servlet.RequestDispatcher; import javax.validation.constraints.NotNull; +import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.springframework.beans.DirectFieldAccessor; @@ -73,8 +74,14 @@ import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; +import org.springframework.web.servlet.resource.CachingResourceTransformer; +import org.springframework.web.servlet.resource.CssLinkResourceTransformer; import org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler; +import org.springframework.web.servlet.resource.GzipResourceResolver; +import org.springframework.web.servlet.resource.PathResourceResolver; import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; +import org.springframework.web.servlet.resource.ResourceResolver; +import org.springframework.web.servlet.resource.ResourceTransformer; import org.springframework.web.servlet.theme.ThemeChangeInterceptor; import org.springframework.web.util.UrlPathHelper; @@ -84,6 +91,7 @@ import static org.junit.Assert.*; * @author Keith Donald * @author Arjen Poutsma * @author Jeremy Grelle + * @author Brian Clozel */ public class MvcNamespaceTests { @@ -291,6 +299,34 @@ public class MvcNamespaceTests { SimpleUrlHandlerMapping mapping = appContext.getBean(SimpleUrlHandlerMapping.class); assertNotNull(mapping); assertEquals(5, mapping.getOrder()); + assertNotNull(mapping.getUrlMap().get("/resources/**")); + + ResourceHttpRequestHandler handler = appContext.getBean((String)mapping.getUrlMap().get("/resources/**"), + ResourceHttpRequestHandler.class); + assertNotNull(handler); + assertEquals(3600, handler.getCacheSeconds()); + } + + @Test + public void testResourcesWithResolversTransformers() throws Exception { + loadBeanDefinitions("mvc-config-resources-resolvers-transformers.xml", 10); + + SimpleUrlHandlerMapping mapping = appContext.getBean(SimpleUrlHandlerMapping.class); + assertNotNull(mapping); + assertNotNull(mapping.getUrlMap().get("/resources/**")); + ResourceHttpRequestHandler handler = appContext.getBean((String)mapping.getUrlMap().get("/resources/**"), + ResourceHttpRequestHandler.class); + assertNotNull(handler); + + List resolvers = handler.getResourceResolvers(); + assertThat(resolvers, Matchers.hasSize(2)); + assertThat(resolvers.get(0), Matchers.instanceOf(PathResourceResolver.class)); + assertThat(resolvers.get(1), Matchers.instanceOf(GzipResourceResolver.class)); + + List transformers = handler.getResourceTransformers(); + assertThat(transformers, Matchers.hasSize(2)); + assertThat(transformers.get(0), Matchers.instanceOf(CachingResourceTransformer.class)); + assertThat(transformers.get(1), Matchers.instanceOf(CssLinkResourceTransformer.class)); } @Test diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-resolvers-transformers.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-resolvers-transformers.xml new file mode 100644 index 0000000000..183907c4eb --- /dev/null +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-resolvers-transformers.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + +