Adam Greenfield created WW-4702:
-----------------------------------

             Summary: List based parameters no longer work when there is only 
one value.
                 Key: WW-4702
                 URL: https://issues.apache.org/jira/browse/WW-4702
             Project: Struts 2
          Issue Type: Bug
    Affects Versions: 2.5.5
            Reporter: Adam Greenfield


If an action has a List parameter, but is only called with one value, the 
parameter is never set.

Consider the basic action below.

{noformat}
public class TestAction
{
        private List<SomeObject> object;

        public String execute()
        {
                for (SomeObject user : object)
                {
                        System.out.println("as list" + user.field);
                }
                return "success";
        }

        public static class SomeObject{
                private String field;

                public void setField(String field)
                {
                        this.field = field;
                }
        }

        public List<SomeObject> getObject()
        {
                return object;
        }

        public void setObject(List<SomeObject> object)
        {
                this.object = object;
        }
}
{noformat}

Performing a GET on "/test.action?object.field=a" 
Expected outcome: "object" list should be populated with 1 object. with a field 
value of "a"
Actual Outcome: object list is empty.

Performing a GET on "/test.action?object.field=a&object.field=b" works as 
expected (list has 2 entries). 

The following changes to 
[ParametersInterceptor|https://fisheye6.atlassian.com/browse/struts/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?r=6ab6ec879cc9eb1997b88856173d2123b32509ee#to206]
 break this behavior. because 
[XWorkListPropertyAccessor|https://fisheye6.atlassian.com/browse/struts/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkListPropertyAccessor.java?r=c7fdf7ffc5aa6744e9f3dc16c490aa0abc65f993#to138]
 Expects an Array of strings for value (which was previously sent when 
HttpParameters was a map instead of an Object).

{noformat}
if (value instanceof Parameter.File) {
     newStack.setParameter(name, value.getObject());
} else  if (value.isMultiple()) {
    newStack.setParameter(name, value.getMultipleValues());
} else {
     newStack.setParameter(name, value.getValue());
}
{noformat}





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to