UrlPathHelper cuts off trailing servlet-path slashes for root mappings (on WebSphere; SPR-7052)
This commit is contained in:
parent
c24bafd644
commit
20f4e9023b
|
|
@ -33,13 +33,7 @@ import org.springframework.core.io.ClassPathResource;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
import org.springframework.format.annotation.DateTimeFormat.ISO;
|
import org.springframework.format.annotation.DateTimeFormat.ISO;
|
||||||
import org.springframework.format.support.FormattingConversionServiceFactoryBean;
|
import org.springframework.format.support.FormattingConversionServiceFactoryBean;
|
||||||
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
|
|
||||||
import org.springframework.http.converter.FormHttpMessageConverter;
|
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
import org.springframework.http.converter.StringHttpMessageConverter;
|
|
||||||
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
|
|
||||||
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
|
|
||||||
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
|
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
import org.springframework.mock.web.MockHttpServletRequest;
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
import org.springframework.mock.web.MockHttpServletResponse;
|
||||||
import org.springframework.mock.web.MockServletContext;
|
import org.springframework.mock.web.MockServletContext;
|
||||||
|
|
@ -239,6 +233,7 @@ public class MvcNamespaceTests {
|
||||||
mapping.setDefaultHandler(new TestController());
|
mapping.setDefaultHandler(new TestController());
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
|
request.setMethod("GET");
|
||||||
|
|
||||||
HandlerExecutionChain chain = mapping.getHandler(request);
|
HandlerExecutionChain chain = mapping.getHandler(request);
|
||||||
assertEquals(4, chain.getInterceptors().length);
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
|
|
@ -253,7 +248,6 @@ public class MvcNamespaceTests {
|
||||||
assertNotNull(adapter);
|
assertNotNull(adapter);
|
||||||
|
|
||||||
request.setRequestURI("/foo");
|
request.setRequestURI("/foo");
|
||||||
request.setMethod("GET");
|
|
||||||
chain = mapping2.getHandler(request);
|
chain = mapping2.getHandler(request);
|
||||||
assertEquals(4, chain.getInterceptors().length);
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
|
@ -262,7 +256,9 @@ public class MvcNamespaceTests {
|
||||||
ModelAndView mv = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
ModelAndView mv = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
assertNull(mv.getViewName());
|
assertNull(mv.getViewName());
|
||||||
|
|
||||||
request.setRequestURI("/bar");
|
request.setRequestURI("/myapp/app/bar");
|
||||||
|
request.setContextPath("/myapp");
|
||||||
|
request.setServletPath("/app");
|
||||||
chain = mapping2.getHandler(request);
|
chain = mapping2.getHandler(request);
|
||||||
assertEquals(4, chain.getInterceptors().length);
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
|
@ -270,8 +266,67 @@ public class MvcNamespaceTests {
|
||||||
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
||||||
ModelAndView mv2 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
ModelAndView mv2 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
assertEquals("baz", mv2.getViewName());
|
assertEquals("baz", mv2.getViewName());
|
||||||
|
|
||||||
|
request.setRequestURI("/myapp/app/");
|
||||||
|
request.setContextPath("/myapp");
|
||||||
|
request.setServletPath("/app");
|
||||||
|
chain = mapping2.getHandler(request);
|
||||||
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[2] instanceof LocaleChangeInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
||||||
|
ModelAndView mv3 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
|
assertEquals("root", mv3.getViewName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** WebSphere gives trailing servlet path slashes by default!! */
|
||||||
|
@Test
|
||||||
|
public void testViewControllersOnWebSphere() throws Exception {
|
||||||
|
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext);
|
||||||
|
reader.loadBeanDefinitions(new ClassPathResource("mvc-config-view-controllers.xml", getClass()));
|
||||||
|
assertEquals(9, appContext.getBeanDefinitionCount());
|
||||||
|
appContext.refresh();
|
||||||
|
|
||||||
|
SimpleUrlHandlerMapping mapping2 = appContext.getBean(SimpleUrlHandlerMapping.class);
|
||||||
|
SimpleControllerHandlerAdapter adapter = appContext.getBean(SimpleControllerHandlerAdapter.class);
|
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
|
request.setMethod("GET");
|
||||||
|
request.setRequestURI("/myapp/app/bar");
|
||||||
|
request.setContextPath("/myapp");
|
||||||
|
request.setServletPath("/app/");
|
||||||
|
HandlerExecutionChain chain = mapping2.getHandler(request);
|
||||||
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[2] instanceof LocaleChangeInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
||||||
|
ModelAndView mv2 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
|
assertEquals("baz", mv2.getViewName());
|
||||||
|
|
||||||
|
request.setRequestURI("/myapp/app/");
|
||||||
|
request.setContextPath("/myapp");
|
||||||
|
request.setServletPath("/app/");
|
||||||
|
chain = mapping2.getHandler(request);
|
||||||
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[2] instanceof LocaleChangeInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
||||||
|
ModelAndView mv3 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
|
assertEquals("root", mv3.getViewName());
|
||||||
|
|
||||||
|
request.setRequestURI("/myapp/");
|
||||||
|
request.setContextPath("/myapp");
|
||||||
|
request.setServletPath("/");
|
||||||
|
chain = mapping2.getHandler(request);
|
||||||
|
assertEquals(4, chain.getInterceptors().length);
|
||||||
|
assertTrue(chain.getInterceptors()[1] instanceof ConversionServiceExposingInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[2] instanceof LocaleChangeInterceptor);
|
||||||
|
assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor);
|
||||||
|
mv3 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler());
|
||||||
|
assertEquals("root", mv3.getViewName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
public static class TestController {
|
public static class TestController {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,17 @@
|
||||||
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.0.xsd">
|
||||||
|
|
||||||
<mvc:annotation-driven />
|
<mvc:annotation-driven/>
|
||||||
|
|
||||||
<mvc:view-controller path="/foo" />
|
<mvc:view-controller path="/foo"/>
|
||||||
|
|
||||||
<mvc:view-controller path="/bar" view-name="baz" />
|
<mvc:view-controller path="/bar" view-name="baz"/>
|
||||||
|
|
||||||
|
<mvc:view-controller path="/" view-name="root"/>
|
||||||
|
|
||||||
<mvc:interceptors>
|
<mvc:interceptors>
|
||||||
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
|
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
|
||||||
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
|
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
|
||||||
</mvc:interceptors>
|
</mvc:interceptors>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ package org.springframework.web.util;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
@ -226,6 +225,10 @@ public class UrlPathHelper {
|
||||||
if (servletPath == null) {
|
if (servletPath == null) {
|
||||||
servletPath = request.getServletPath();
|
servletPath = request.getServletPath();
|
||||||
}
|
}
|
||||||
|
if (servletPath.length() > 1 && servletPath.endsWith("/")) {
|
||||||
|
// Probably on WebSphere: removing trailing slash...
|
||||||
|
servletPath = servletPath.substring(0, servletPath.length() - 1);
|
||||||
|
}
|
||||||
return servletPath;
|
return servletPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue