ParametersInterceptor fails to assign value of form checkbox to Boolean bean
attribute
----------------------------------------------------------------------------------------
Key: WW-2044
URL: https://issues.apache.org/struts/browse/WW-2044
Project: Struts 2
Issue Type: Bug
Components: Interceptors
Affects Versions: 2.0.8
Environment: NetBeans IDE 5.5.1 (Bundled Tomcat 5.5.17), Java 1.6
Reporter: Jeremy Mikola
Priority: Minor
I witnessed a case where the ParametersInterceptor fails to translate the
request parameter (via GET method in my tests) and properly set the
corresponding attribute for a bean object within an Action. The ingredients
for this error condition were as follows:
(1) Basic JSP page with a struts checkbox widget. This allowed me to tamper
with the bean.checkbox request parameter via the query string (and observe when
it was properly set - as a default value in this case - or not).
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:checkbox key="bean.checkbox"/>
(2) A simple Bean class. Take special note that the isCheckbox() method
returns a boolean primitive (I am aware of the Boolean/boolean automagic
conversions as of Java 1.5, but this was intentional).
public class Bean {
private Boolean checkbox;
public Bean() { }
public Boolean getCheckbox() { return this.checkbox; }
public void setCheckbox(Boolean checkbox) { this.checkbox = checkbox; }
public boolean isCheckbox() { return this.checkbox.booleanValue(); }
}
(3) Basic action class, inheriting from ActionSupport. This class contained a
private Bean object (named "bean" :), and corresponding get/set methods.
(4) The struts.xml file was configured to execute the default execute() method
for this action, and display the aforementioned JSP page. The
prepareParamsPrepareStack was used as the interceptor stack.
----
Through some debugging, I observed that the Bean$setCheckbox method was never
called for the query string:
/CheckboxTest.action?bean.checkbox=true
As a result, the JSP would load and the existing request parameter value would
not be pre-loaded into the checkbox. As you might expect, this extends beyond
the inability to populate the checkbox. In my project, where I discovered this
behavior, the parameter was simply never set while processing form POST
submissions.
When changing the Bean$isCheckbox method's return type to Boolean, the
ParametersInterceptor functions correctly. Furthermore, if I leave the
method's return value as a boolean, but change its name (e.g.
isTheCheckboxSet), the problem is also solved.
As best I can tell, the presence of a *Checkbox (note the wildcard) method with
a return type different from setCheckbox method's argument type is to blame.
Still, I see no logical reason why the offending method should not be allowed
to co-exist.
>From what I understand the ParametersInterceptor delegates calling of the set
>methods to a ValueStack handler, so I would not be surprised if the root cause
>of this error is found outside of the interceptor class.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.