-
Notifications
You must be signed in to change notification settings - Fork 38.8k
Description
Hans Desmet opened SPR-6871 and commented
When you submit a form, with databinding on a command object with indexed properties, the indexed properties of the command object are not filled in.
I think this bug is related to the correction that happened in #11506.
The characters [ and ] are not only removed from the id attrbute of the HTML elements, but also (unnessesary) from the name attribute of the HTML elements.
You can see it happening via next example.
When you type 10 and 20 in the input fields, the output to the console is: {Belgium=null, Switzerland=null}
while the output should have been {Belgium=10, Switzerland=20}
The class that acts as command object:
package org.example.entities;
import java.util.LinkedHashMap;
import java.util.Map;
public class Continent {
// key = name of country
// Integer= number of inhabitants
private Map<String, Integer> countries = new LinkedHashMap<String, Integer>();
public Continent() {
countries.put("Belgium", null);
countries.put("Switzerland", null);
}
public void setCountries(Map<String, Integer> countries) {
this.countries = countries;
}
public Map<String, Integer> getCountries() {
return countries;
}
}
The Controller class:
package org.example.web;
import org.example.entities.Continent;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ContinentController {
@RequestMapping(value = "/continent.htm", method = RequestMethod.GET)
public String continentForm(Model model) {
Continent continent = new Continent();
model.addAttribute(continent);
return "continent.jsp";
}
@RequestMapping(value = "/continent.htm", method = RequestMethod.POST)
public String continentForm(@ModelAttribute Continent continent,
BindingResult bindingResult) {
System.out.println(continent.getCountries()); // Here you can see the bug
return "continent.jsp";
}
}
continent.jsp
<?xml version="1.0" encoding="UTF-8"?>
<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<title>Continent example</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form:form commandName="continent">
<c:forEach items="${continent.countries}" var="entry">
<div>
<form:label path="countries[${entry.key}]">${entry.key}</form:label>
<form:input path="countries[${entry.key}]" />
<form:errors path="countries[${entry.key}]" />
</div>
</c:forEach>
<div><input type="submit" /></div>
</form:form>
</body>
</html>
Affects: 3.0.1
Issue Links:
- Indexed properties not set correctly in form tags [SPR-6921] #11586 Indexed properties not set correctly in form tags ("is duplicated by")
- form:select 3.0.1 regression bug when binding to a map [SPR-7040] #11702 form:select 3.0.1 regression bug when binding to a map ("is duplicated by")
- form:checkbox tag creates invalid HTML id when bound to indexed property [SPR-6840] #11506 form:checkbox tag creates invalid HTML id when bound to indexed property
- org.springframework.web.servlet.tags.form.TagIdGenerator doesn't remove characters [] and double-quotes [SPR-5382] #10055 org.springframework.web.servlet.tags.form.TagIdGenerator doesn't remove characters [] and double-quotes
Referenced from: commits 67b342d
3 votes, 8 watchers