POLISH CREATION OF DATA BINDERS FOR @RequestMapping METHODS

Make it possible to hook in custom ServletRequestDataBinderFactory
by overriding RequestMappingHandlerAdapter. 

Create ExtendedServletRequestDataBinder to add URI template vars
to the binding values taking advantage of a new extension hook in
ServletRequestDataBinder to provide additional values to bind.
This commit is contained in:
Rossen Stoyanchev
2011-09-26 09:27:09 +00:00
parent 6bc4ea058c
commit 48f7dcc464
7 changed files with 123 additions and 80 deletions

View File

@@ -21,42 +21,26 @@ import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.TestBean;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.servlet.HandlerMapping;
/**
* Test fixture with {@link ServletRequestDataBinderFactory}.
* Test fixture for {@link ExtendedServletRequestDataBinder}.
*
* @author Rossen Stoyanchev
*/
public class ServletRequestDataBinderFactoryTests {
public class ExtendedServletRequestDataBinderTests {
private ServletRequestDataBinderFactory binderFactory;
private MockHttpServletRequest request;
private NativeWebRequest webRequest;
@Before
public void setup() {
binderFactory = new ServletRequestDataBinderFactory(null, null);
request = new MockHttpServletRequest();
webRequest = new ServletWebRequest(request);
RequestContextHolder.setRequestAttributes(webRequest);
}
@After
public void teardown() {
RequestContextHolder.resetRequestAttributes();
this.request = new MockHttpServletRequest();
}
@Test
@@ -67,7 +51,7 @@ public class ServletRequestDataBinderFactoryTests {
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
TestBean target = new TestBean();
WebDataBinder binder = binderFactory.createBinder(webRequest, target, "");
WebDataBinder binder = new ExtendedServletRequestDataBinder(target, "");
((ServletRequestDataBinder) binder).bind(request);
assertEquals("nameValue", target.getName());
@@ -75,7 +59,7 @@ public class ServletRequestDataBinderFactoryTests {
}
@Test
public void requestParamsOverrideUriTemplateVars() throws Exception {
public void uriTemplateVarAndRequestParam() throws Exception {
request.addParameter("age", "35");
Map<String, String> uriTemplateVars = new HashMap<String, String>();
@@ -84,17 +68,17 @@ public class ServletRequestDataBinderFactoryTests {
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
TestBean target = new TestBean();
WebDataBinder binder = binderFactory.createBinder(webRequest, target, "");
WebDataBinder binder = new ExtendedServletRequestDataBinder(target, "");
((ServletRequestDataBinder) binder).bind(request);
assertEquals("nameValue", target.getName());
assertEquals(35, target.getAge());
assertEquals(25, target.getAge());
}
@Test
public void noUriTemplateVars() throws Exception {
TestBean target = new TestBean();
WebDataBinder binder = binderFactory.createBinder(webRequest, target, "");
WebDataBinder binder = new ExtendedServletRequestDataBinder(target, "");
((ServletRequestDataBinder) binder).bind(request);
assertEquals(null, target.getName());