diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java index dd1cd4479dab09895574d585548d5aac24b52a7f..51c021abd75acb3c8aec4e3a8bc9384b257a013b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package org.springframework.web.servlet.mvc.method.annotation; import java.util.Map; +import java.util.Map.Entry; + import javax.servlet.ServletRequest; import org.springframework.beans.MutablePropertyValues; @@ -54,13 +56,24 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { } /** - * Add URI template variables to the property values used for data binding. + * Merge URI variables into the property values to use for data binding. */ - @Override + @Override @SuppressWarnings("unchecked") protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) { String attr = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE; - mpvs.addPropertyValues((Map) request.getAttribute(attr)); - } + Map uriVars = (Map) request.getAttribute(attr); + if (uriVars != null) { + for (Entry entry : uriVars.entrySet()) { + if (mpvs.contains(entry.getKey())) { + logger.warn("Skipping URI variable '" + entry.getKey() + + "' since the request contains a bind value with the same name."); + } + else { + mpvs.addPropertyValue(entry.getKey(), entry.getValue()); + } + } + } + } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java index f65e034af7145b818a2790dfa7c5c55721551db1..3412d6bd71d61037c4c73afd060b275d695fd866 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java @@ -37,19 +37,19 @@ import org.springframework.web.servlet.HandlerMapping; public class ExtendedServletRequestDataBinderTests { private MockHttpServletRequest request; - + @Before public void setup() { this.request = new MockHttpServletRequest(); } - + @Test public void createBinder() throws Exception { Map uriTemplateVars = new HashMap(); uriTemplateVars.put("name", "nameValue"); uriTemplateVars.put("age", "25"); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars); - + TestBean target = new TestBean(); WebDataBinder binder = new ExtendedServletRequestDataBinder(target, ""); ((ServletRequestDataBinder) binder).bind(request); @@ -61,18 +61,18 @@ public class ExtendedServletRequestDataBinderTests { @Test public void uriTemplateVarAndRequestParam() throws Exception { request.addParameter("age", "35"); - + Map uriTemplateVars = new HashMap(); uriTemplateVars.put("name", "nameValue"); uriTemplateVars.put("age", "25"); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars); - + TestBean target = new TestBean(); WebDataBinder binder = new ExtendedServletRequestDataBinder(target, ""); ((ServletRequestDataBinder) binder).bind(request); assertEquals("nameValue", target.getName()); - assertEquals(25, target.getAge()); + assertEquals(35, target.getAge()); } @Test