You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Ted Husted (JIRA)" <ji...@apache.org> on 2007/07/23 04:36:08 UTC

[jira] Updated: (WW-2044) ParametersInterceptor fails to assign value of form checkbox to Boolean bean attribute

     [ https://issues.apache.org/struts/browse/WW-2044?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ted Husted updated WW-2044:
---------------------------

    Fix Version/s: Future

Setting Fix Version to "future" for issues without a set fix version. 


> 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
>             Fix For: Future
>
>
> 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.