You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Alexander Langer (JIRA)" <de...@myfaces.apache.org> on 2005/12/20 20:42:41 UTC

[jira] Created: (MYFACES-966) t:Radio not checked correctly with f:selectItem and non-String backing bean property

t:Radio not checked correctly with f:selectItem and non-String backing bean property
------------------------------------------------------------------------------------

         Key: MYFACES-966
         URL: http://issues.apache.org/jira/browse/MYFACES-966
     Project: MyFaces
        Type: Bug
 Environment: Jboss 4.0.3, EJB3, JBoss Seam, Facelets
    Reporter: Alexander Langer


Look at this simple selectOneRadio tag:

<t:selectOneRadio id="question" value="#{haqInput.testme}" layout="spread">
    <f:selectItem itemValue="0" itemLabel="a"/>
    <f:selectItem itemValue="1" itemLabel="b"/>
    <f:selectItem itemValue="2" itemLabel="c"/>
    <f:selectItem itemValue="3" itemLabel="d"/>
</t:selectOneRadio>

<t:radio for="question" index="0" />
<t:radio for="question" index="1" />
<t:radio for="question" index="2" />
<t:radio for="question" index="3" />

#{haqInput.testme} is an Integer property of the backing bean haqInput.

If you submit the form to another view and come back to this page (I'm using a next/prev wizard), none of the rendered radio buttons contains
the "checked" attribute.  However, if you remove the "layout=spread" attribute, one of the default radio buttons (the non-t:radio versions) are rendered correctly including the "checked" attribute.

I have digged into the problem.  In Tomahawk's HtmlRadioRenderer.java we read:

        renderRadio(facesContext,
                    uiSelectOne,
                    itemStrValue,
                    selectItem.getLabel(),
                    selectItem.isDisabled(),
                    currentValue == null && itemValue == null ||
                    currentValue != null && currentValue.equals(itemValue), false);

However, the equals() check is false since  <f:selectItem itemValue="1" itemLabel="b"/> will render the actual itemValue as a String() class,
but currentValue's class is of type Integer.  I have verified this in some debug output I just added to the file:

20:40:59,583 INFO  [STDOUT] itemValue: 3, type java.lang.String
20:40:59,583 INFO  [STDOUT] currentValue: 3, type java.lang.Integer

I don't know how the standard myfaces version of selectOneRadio checks for equality, so this is probably how you would do this.  I just added
another "|| currentValue != null && currentValue.toString().equals(itemStrValue)" in the condition above, this works for me but is probalby only a back hack.

Another workaround is probably using a backing bean and f:selectItems, where the itemValue variables are already of type Integer as well. I'm going to try this out now, because the t:inputDate in the latest subversion checkout is broken as well. *sigh*



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira