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 >>> >>> >> >