New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Spring MVC regression: binding to indexed properties is broken [SPR-6871] #11537

Closed
spring-issuemaster opened this Issue Feb 18, 2010 · 11 comments

Comments

Projects
None yet
2 participants
@spring-issuemaster
Copy link
Collaborator

spring-issuemaster commented Feb 18, 2010

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:

  • #11586 Indexed properties not set correctly in form tags ("is duplicated by")
  • #11702 form:select 3.0.1 regression bug when binding to a map ("is duplicated by")
  • #11506 form:checkbox tag creates invalid HTML id when bound to indexed property
  • #10055 org.springframework.web.servlet.tags.form.TagIdGenerator doesn't remove characters [] and double-quotes

Referenced from: commits 67b342d

3 votes, 8 watchers

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 19, 2010

Zach Bailey commented

This is a rather grievous bug since it affects ALL form tags that contain these bracketed paths, which we use extensively throughout our application. For us, this would be considered a blocker-level bug since there is no reasonable workaround.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 20, 2010

Juergen Hoeller commented

Ouch, that's a pretty bad regression that we unfortunately neither had a unit test nor an integration test for. Sorry for that - an unfortunate last-minute accident.

I've fixed this for 3.0.2 now. Should be available in tonight's 3.0.2 snapshot (build 591 and above).

FYI, 3.0.2 is scheduled for release in early March already. Please use a snapshot for the time being and let us know whether it works for you.

Juergen

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 20, 2010

Zach Bailey commented

Thanks for the quick turnaround, Juergen. I'll take a look at the snapshot and confirm the issue is fixed.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 21, 2010

Hans Desmet commented

Tried it out with 3.0.2 snapshot (build 592). Problem solved.

P.S. Problem in related #11528 not yet solved

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 22, 2010

Grant Gochnauer commented

Juergen,

Where can I find the nightly snapshot?

Thanks

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 22, 2010

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 25, 2010

Grant Gochnauer commented

There appears to be another issue with this:

https://fisheye.springsource.org/viewrep/spring-framework/trunk/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/AbstractDataBoundFormElementTag.java?r1=2980&r2=3018

It appears that indexed properties when used on the "id" attribute are still stripped.

Thus we would get something like:
<input id="promotionUser.formUserPropertyCodes'user_type'2" name="promotionUser.formUserPropertyCodes['user_type']" type="radio" value="543"/>

Notice how "ID" has the stripped brackets but the name attribute does not.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 25, 2010

Zach Bailey commented

Grant,

While I am not a core spring developer I am confident that is intended behavior, because if you look at the HTML/XHTML spec you will see that id attributes cannot contain bracket characters.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 25, 2010

Grant Gochnauer commented

Zach,

I suppose that is true but it does break backward compatibility with 3.0.0 in our environment against 3.0.2's fix.

Grant

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 25, 2010

Juergen Hoeller commented

I'm afraid this is exactly what we desired to fix in 3.0.1 originally: the id attribute shouldn't contain any such brackets anymore, for no kind of input element. We were already doing this for all other form tags, just not for checkboxes and radiobuttons. It seems very much worth it to fix this remaining case once and for all in 3.0.x, with the name attribute regression properly addressed in 3.0.2, even we technically produce different ids for those then.

Juergen

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Feb 25, 2010

Grant Gochnauer commented

Thanks for the quick response Juergen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment