Hello Burton,

Thank you; I examined your example and found out this behavior is 
because of something in Struts named "automatic checkbox detection", 
CheckboxInterceptor.

When your `choices` count is bigger than 1, you'll see your desired 
behavior because CheckboxInterceptor does nothing with following message 
where value.isMultiple() is true:

```java
if(value.isMultiple()) {
     LOG.debug("Bypassing automatic checkbox detection due to multiple 
checkboxes of the same name: {}", name);
} else if(!parameters.contains(checkboxName)) {
     extraParams.put(checkboxName, new Request(checkboxName, 
this.uncheckedValue));
}
```

But what happens when your `choices` count is one and you don't click on 
that one (your current example): Actually W3C says unchecked checkbox 
wont be posted, so, the above else will be executed (because 
!parameters.contains(checkboxName) is true) and CheckboxInterceptor sets 
a new parameter, "itemsFail->false". Then OGNL cannot convert `false` to 
an array of Integer into your action, so, the result will be changed to 
`input`.

I searched how to also post unchecked check boxes and found out that 
following makes your example working:
```jsp
<s:iterator var="choice" value="%{choices}">
     <s:hidden value='0' name='itemsFail'/><!-- I added this; a default -->
     <s:checkbox name="itemsFail" fieldValue="%{choice}" 
value="%{isItemsFailSelected(#choice)}"/> <s:property value="%{#choice}"/>
</s:iterator>
```

Hope these help!
Yasser.

On 10/1/2017 6:57 AM, Burton Rhodes wrote:
> Well shoot - after further testing it seems the issue is still present.  I
> isolated the issue in a simple mvn webapp (see link below).  Essentially
> Struts conversion fails when: 1) setting form input element to a
> List<Integer>, 2) there is only one checkbox in the list, 3) the checkbox
> is not checked when the form is submitted.  The situation arises for me
> when I need to display a list of checkboxes, but I can't use
> <s:checkboxlist/> tag because the page requires a more advanced html
> layout.  Thus I am forced to display the checkbox list using an
> <s:iterator/> and the <s:checkbox/> tag.  If the displayed list so happens
> to have only one element, and the user doesn't check it, the conversion
> fails.
> 
> I am using now Struts Version 2.5.13.
> 
> *Test Struts Webb App*
> *Download*: https://www.dropbox.com/s/x27o9a8qky9nwta/listTest.zip?dl=0
> *Action*: mvn jetty:run
> *Url*: http://localhost:8080/ListConverterTest.action
> 
> On Fri, Sep 29, 2017 at 10:56 AM, Burton Rhodes <burtonrho...@gmail.com>
> wrote:
> 
>> Sorry for the delay.  I have upgraded to the newest version and everything
>> seems to be working.  Thanks!
>>
>> On Mon, Sep 25, 2017 at 2:34 AM, Lukasz Lenart <lukaszlen...@apache.org>
>> wrote:
>>
>>> 2017-09-25 5:04 GMT+02:00 Burton Rhodes <burtonrho...@gmail.com>:
>>>> When extending the StrutsTypeConverter, is there anyway to figure out if
>>>> the "toClass" is a List<Integer> or a List<String>?  I have found that
>>> when
>>>> converting data from a submitted webpage that has a value of a List in a
>>>> single variable, the standard struts conversion fails.  For example:
>>>> <s:hidden name="integerList" value="%{integerList}" /> display as
>>> <s:hidden
>>>> name="integerList" value="[1,2,3,4,5]" />.  When the form submits, this
>>>> value will not convert properly back into the List.  In addition, the
>>>> conversion fails if you have a list of checkboxes and the user only
>>> checks
>>>> one -  hence only a single variable being converted to a List.
>>>>
>>>> I have solved this issue by creating a MyListConverter, but I have to
>>>> declare the converter on each action in a [-conversion.properties] file
>>>> which is now becoming a bit cumbersome since this is such a common
>>>> occurrence. I have also declared some on my model/entity beans, but
>>>> still.... I would love to have a more global "List" converter, such as:
>>>>
>>>> [xwork-conversion.properties]
>>>> java.util.List=com.afs.web.converter.MyListConverter
>>>>
>>>> Thus any List that is encountered, I could attempt "my conversion" and
>>> send
>>>> up the chain of command if the resulting List is not of List<Integer> or
>>>> List<String>.
>>>>
>>>> [Psuedo_Code]
>>>> public class MyListConverter extends StrutsTypeConverter {
>>>>      public Object convertFromString(Map context, String[] values, Class
>>>> toClass) {
>>>>          // Is toClass List<Integer>, then try "my" conversion
>>>>
>>>>          // Else is toClass List<String?, then try "my" conversion
>>>>
>>>>          // Else return performFallbackConversion(context, o, toClass);
>>>>      }
>>>> }
>>>>
>>>> Any ideas?  Or am I going about this incorrectly?
>>>
>>> What version of Struts do you use? I think this was resolved in 2.5.13
>>> or 2.5.12 - I meant conversion of list of built-in types (ints,
>>> doubles, etc), to convert your own type just register it (as for the
>>> List above).
>>>
>>>
>>> Regards
>>> --
>>> Ɓukasz
>>> + 48 606 323 122 http://www.lenart.org.pl/
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
>>> For additional commands, e-mail: user-h...@struts.apache.org
>>>
>>>
>>
> 

Reply via email to