SPR-6413 and SPR-6414 first cut: needs review, particularly compatibility note in AbstractHandlerMapping

This commit is contained in:
Keith Donald
2009-11-26 08:27:42 +00:00
parent 6c89946d42
commit de1d548725
12 changed files with 301 additions and 72 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.web.servlet.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Date;
@@ -34,7 +35,6 @@ import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.style.StylerUtils;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import org.springframework.format.support.FormattingConversionServiceFactoryBean;
@@ -50,7 +50,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;
import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
@@ -79,6 +82,7 @@ public class MvcNamespaceTests {
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
assertEquals(0, mapping.getOrder());
AnnotationMethodHandlerAdapter adapter = container.getBean(AnnotationMethodHandlerAdapter.class);
assertNotNull(adapter);
assertNotNull(container.getBean(FormattingConversionServiceFactoryBean.class));
@@ -103,12 +107,8 @@ public class MvcNamespaceTests {
assertEquals(4, container.getBeanDefinitionCount());
container.refresh();
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
assertEquals(0, mapping.getOrder());
AnnotationMethodHandlerAdapter adapter = container.getBean(AnnotationMethodHandlerAdapter.class);
assertNotNull(adapter);
assertNotNull(container.getBean(LocalValidatorFactoryBean.class));
TestController handler = new TestController();
@@ -126,12 +126,8 @@ public class MvcNamespaceTests {
assertEquals(4, container.getBeanDefinitionCount());
container.refresh();
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
assertEquals(0, mapping.getOrder());
AnnotationMethodHandlerAdapter adapter = container.getBean(AnnotationMethodHandlerAdapter.class);
assertNotNull(adapter);
assertNotNull(container.getBean(FormattingConversionServiceFactoryBean.class));
TestController handler = new TestController();
@@ -149,12 +145,13 @@ public class MvcNamespaceTests {
public void testInterceptors() throws Exception {
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container);
reader.loadBeanDefinitions(new ClassPathResource("mvc-config-interceptors.xml", getClass()));
assertEquals(4, container.getBeanDefinitionCount());
assertEquals(6, container.getBeanDefinitionCount());
container.refresh();
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
mapping.setRootHandler(new TestController());
mapping.setDefaultHandler(new TestController());
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("locale", "en");
request.addParameter("theme", "green");
@@ -165,6 +162,65 @@ public class MvcNamespaceTests {
assertTrue(chain.getInterceptors()[2] instanceof ThemeChangeInterceptor);
}
@Test
public void testBeanDecoration() throws Exception {
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container);
reader.loadBeanDefinitions(new ClassPathResource("mvc-config-bean-decoration.xml", getClass()));
assertEquals(5, container.getBeanDefinitionCount());
container.refresh();
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
mapping.setDefaultHandler(new TestController());
MockHttpServletRequest request = new MockHttpServletRequest();
HandlerExecutionChain chain = mapping.getHandler(request);
assertEquals(2, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor);
LocaleChangeInterceptor interceptor = (LocaleChangeInterceptor) chain.getInterceptors()[1];
assertEquals("lang", interceptor.getParamName());
}
@Test
public void testViewControllers() throws Exception {
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container);
reader.loadBeanDefinitions(new ClassPathResource("mvc-config-view-controllers.xml", getClass()));
assertEquals(8, container.getBeanDefinitionCount());
container.refresh();
DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class);
assertNotNull(mapping);
mapping.setDefaultHandler(new TestController());
MockHttpServletRequest request = new MockHttpServletRequest();
HandlerExecutionChain chain = mapping.getHandler(request);
assertEquals(3, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor);
SimpleUrlHandlerMapping mapping2 = container.getBean(SimpleUrlHandlerMapping.class);
assertNotNull(mapping2);
SimpleControllerHandlerAdapter adapter = container.getBean(SimpleControllerHandlerAdapter.class);
assertNotNull(adapter);
request.setRequestURI("/foo");
request.setMethod("GET");
chain = mapping2.getHandler(request);
assertEquals(3, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor);
ModelAndView mv = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
assertNull(mv.getViewName());
request.setRequestURI("/bar");
chain = mapping2.getHandler(request);
assertEquals(3, chain.getInterceptors().length);
assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor);
ModelAndView mv2 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
assertEquals("baz", mv2.getViewName());
}
@Controller
public static class TestController {

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven />
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang" />
</mvc:interceptors>
</beans>

View File

@@ -5,11 +5,11 @@
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">
<mvc:annotation-driven>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
</mvc:interceptors>
</mvc:annotation-driven>
<mvc:annotation-driven />
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
</mvc:interceptors>
</beans>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven />
<mvc:view-controller path="/foo" />
<mvc:view-controller path="/bar" view-name="baz" />
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
</mvc:interceptors>
</beans>

View File

@@ -5,6 +5,6 @@
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">
<mvc:annotation-driven/>
<mvc:annotation-driven />
</beans>