提交 1784df8d 编写于 作者: R Rossen Stoyanchev

SPR-6996 Add mvc:interceptor bean references

上级 700a02b0
...@@ -19,7 +19,6 @@ package org.springframework.web.servlet.config; ...@@ -19,7 +19,6 @@ package org.springframework.web.servlet.config;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
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.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
...@@ -42,35 +41,36 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { ...@@ -42,35 +41,36 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser {
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element)); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
parserContext.pushContainingComponent(compDefinition); parserContext.pushContainingComponent(compDefinition);
List<Element> interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "interceptor" }); List<Element> interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "ref", "interceptor" });
for (Element interceptor : interceptors) { for (Element interceptor : interceptors) {
RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class);
mappedInterceptorDef.setSource(parserContext.extractSource(interceptor)); mappedInterceptorDef.setSource(parserContext.extractSource(interceptor));
mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String[] pathPatterns; String[] pathPatterns;
BeanDefinitionHolder interceptorDef; Object interceptorBean;
if ("interceptor".equals(interceptor.getLocalName())) { if ("interceptor".equals(interceptor.getLocalName())) {
List<Element> paths = DomUtils.getChildElementsByTagName(interceptor, "mapping"); List<Element> paths = DomUtils.getChildElementsByTagName(interceptor, "mapping");
pathPatterns = new String[paths.size()]; pathPatterns = new String[paths.size()];
for (int i = 0; i < paths.size(); i++) { for (int i = 0; i < paths.size(); i++) {
pathPatterns[i] = paths.get(i).getAttribute("path"); pathPatterns[i] = paths.get(i).getAttribute("path");
} }
Element interceptorBean = DomUtils.getChildElementByTagName(interceptor, "bean"); Element beanElem = DomUtils.getChildElementsByTagName(interceptor, new String[] { "bean", "ref"}).get(0);
interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptorBean); interceptorBean = parserContext.getDelegate().parsePropertySubElement(beanElem, null);
interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptorBean, interceptorDef); }
} else { else {
pathPatterns = null; pathPatterns = null;
interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor); interceptorBean = parserContext.getDelegate().parsePropertySubElement(interceptor, null);
interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, interceptorDef);
} }
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns); mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns);
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorDef); mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorBean);
String mappedInterceptorName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef);
parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); String beanName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef);
parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, beanName));
} }
parserContext.popAndRegisterContainingComponent(); parserContext.popAndRegisterContainingComponent();
return null; return null;
} }
} }
...@@ -223,13 +223,22 @@ ...@@ -223,13 +223,22 @@
</xsd:annotation> </xsd:annotation>
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element ref="beans:bean"> <xsd:choice>
<xsd:annotation> <xsd:element ref="beans:bean">
<xsd:documentation source="java:org.springframework.web.servlet.handler.MappedInterceptor"><![CDATA[ <xsd:annotation>
Registers an interceptor that intercepts every request regardless of its URI path. <xsd:documentation><![CDATA[
]]></xsd:documentation> Registers an interceptor that intercepts every request regardless of its URI path..
</xsd:annotation> ]]></xsd:documentation>
</xsd:element> </xsd:annotation>
</xsd:element>
<xsd:element ref="beans:ref">
<xsd:annotation>
<xsd:documentation><![CDATA[
Registers an interceptor that intercepts every request regardless of its URI path..
]]></xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:choice>
<xsd:element name="interceptor"> <xsd:element name="interceptor">
<xsd:annotation> <xsd:annotation>
<xsd:documentation source="java:org.springframework.web.servlet.handler.MappedInterceptor"><![CDATA[ <xsd:documentation source="java:org.springframework.web.servlet.handler.MappedInterceptor"><![CDATA[
...@@ -250,13 +259,22 @@ ...@@ -250,13 +259,22 @@
</xsd:attribute> </xsd:attribute>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element ref="beans:bean"> <xsd:choice>
<xsd:annotation> <xsd:element ref="beans:bean">
<xsd:documentation><![CDATA[ <xsd:annotation>
The interceptor's bean definition. <xsd:documentation><![CDATA[
]]></xsd:documentation> The interceptor's bean definition.
</xsd:annotation> ]]></xsd:documentation>
</xsd:element> </xsd:annotation>
</xsd:element>
<xsd:element ref="beans:ref">
<xsd:annotation>
<xsd:documentation><![CDATA[
A reference to an interceptor bean.
]]></xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:choice>
</xsd:sequence> </xsd:sequence>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
......
...@@ -179,7 +179,7 @@ public class MvcNamespaceTests { ...@@ -179,7 +179,7 @@ public class MvcNamespaceTests {
@Test @Test
public void testInterceptors() throws Exception { public void testInterceptors() throws Exception {
loadBeanDefinitions("mvc-config-interceptors.xml", 14); loadBeanDefinitions("mvc-config-interceptors.xml", 16);
RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class);
assertNotNull(mapping); assertNotNull(mapping);
...@@ -191,20 +191,21 @@ public class MvcNamespaceTests { ...@@ -191,20 +191,21 @@ public class MvcNamespaceTests {
request.addParameter("theme", "green"); request.addParameter("theme", "green");
HandlerExecutionChain chain = mapping.getHandler(request); HandlerExecutionChain chain = mapping.getHandler(request);
assertEquals(3, chain.getInterceptors().length); assertEquals(4, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[0] instanceof ConversionServiceExposingInterceptor); assertTrue(chain.getInterceptors()[0] instanceof ConversionServiceExposingInterceptor);
assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor);
assertTrue(chain.getInterceptors()[2] instanceof ThemeChangeInterceptor); assertTrue(chain.getInterceptors()[2] instanceof WebRequestHandlerInterceptorAdapter);
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
request.setRequestURI("/logged/accounts/12345"); request.setRequestURI("/logged/accounts/12345");
chain = mapping.getHandler(request); chain = mapping.getHandler(request);
assertEquals(4, chain.getInterceptors().length); assertEquals(5, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); assertTrue(chain.getInterceptors()[4] instanceof WebRequestHandlerInterceptorAdapter);
request.setRequestURI("/foo/logged"); request.setRequestURI("/foo/logged");
chain = mapping.getHandler(request); chain = mapping.getHandler(request);
assertEquals(4, chain.getInterceptors().length); assertEquals(5, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); assertTrue(chain.getInterceptors()[4] instanceof WebRequestHandlerInterceptorAdapter);
} }
@Test @Test
......
...@@ -3,12 +3,13 @@ ...@@ -3,12 +3,13 @@
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<mvc:annotation-driven /> <mvc:annotation-driven />
<mvc:interceptors> <mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<ref bean="log4jInterceptor"/>
<mvc:interceptor> <mvc:interceptor>
<mvc:mapping path="/**" /> <mvc:mapping path="/**" />
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" /> <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
...@@ -16,8 +17,11 @@ ...@@ -16,8 +17,11 @@
<mvc:interceptor> <mvc:interceptor>
<mvc:mapping path="/logged/**" /> <mvc:mapping path="/logged/**" />
<mvc:mapping path="/foo/logged" /> <mvc:mapping path="/foo/logged" />
<bean class="org.springframework.web.context.request.Log4jNestedDiagnosticContextInterceptor" /> <ref bean="log4jInterceptor"/>
</mvc:interceptor> </mvc:interceptor>
</mvc:interceptors> </mvc:interceptors>
<bean id="log4jInterceptor"
class="org.springframework.web.context.request.Log4jNestedDiagnosticContextInterceptor" />
</beans> </beans>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册