[ 
https://issues.apache.org/jira/browse/WICKET-1331?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567597#action_12567597
 ] 

Sergiy Yevtushenko commented on WICKET-1331:
--------------------------------------------

I've attached test project based on quickstart which exposes the issue - 
attempt to access home page fails with following exception (relevant part):

org.apache.wicket.WicketRuntimeException: No get method defined for class: 
class java.lang.Long expression: id
     at 
org.apache.wicket.util.lang.PropertyResolver.getGetAndSetter(PropertyResolver.java:433)
     at 
org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:275)
     at 
org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:84)
     at 
org.apache.wicket.markup.html.form.ChoiceRenderer.getIdValue(ChoiceRenderer.java:140)
     at 
org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.getModelValue(AbstractSingleSelectChoice.java:144)
     at 
org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:744)
     at 
org.apache.wicket.markup.html.form.AbstractChoice.onComponentTagBody(AbstractChoice.java:344)
...

If in HomePage.java make following changes:

...
        // default AbstractSingleSelectChoice.getModelValue():
        //form.add(new DropDownChoice("option", getList(), new 
ChoiceRenderer("name", "id"))); <-----

        // Overridden AbstractSingleSelectChoice.getModelValue();
        form.add(new ModifiedDropDownChoice("option", getList(), new 
ChoiceRenderer("name", "id"))); //<-----
...

then home page is rendered properly. Also, this test application seems expose 
another issue which I didn't see before - attempt to submit for traps. 
Debugging shows that in this case entire choice list item is passed without 
conversion. I've not digged deeper.

> getModelValue() in AbstractSingleSelectChoice and ListMultipleChoice can't 
> handle complex list items type correctly
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: WICKET-1331
>                 URL: https://issues.apache.org/jira/browse/WICKET-1331
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.0-final, 1.3.1
>         Environment: Suse 10.3, JRE 1.6 (1.6.0_04-b12), jetty 6.1.7
>            Reporter: Sergiy Yevtushenko
>            Assignee: Igor Vaynberg
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> AbstractSingleSelectChoice.getModelValue() implementation uses List.indexOf() 
> to find the key and this causes problems if list of choices contains complex 
> values rather than simple list of String instances. In this case indexOf() 
> returns -1 and this can't be resolved by overriding equals() for list 
> elements. This happens because internally AbstractList.indexOf() invokes 
> equals() method of passed key value passing it list items as a parameter. 
> Also, current implementation may pass key returned by getModelObject() to 
> IChoiceRender, while it expects values from list of items. Correct 
> implementation of this method may look so:
> -------------------------
>       public String getModelValue()
>       {
>               // @@ Modified by SIY
>               Object object = getModelObject();
>               if (object != null)
>               {
>                       // compare choice items with given keys and pass down
>                       // to IChoiceRenderer list item rather than key
>                       Iterator iter = getChoices().iterator();
>                       int i = 0;
>                       while (iter.hasNext())
>                       {
>                               Object obj = iter.next();
>                               if (obj != null && obj.equals(object))
>                               {
>                                       object = obj;
>                                       break;
>                               }
>                               i++;
>                       }
>                       if (i > getChoices().size())
>                               i = -1;
>                       return getChoiceRenderer().getIdValue(object, i);
>               }
>               return NO_SELECTION_VALUE;
>       }
> -----------------------------------
> Similar issues also present in ListMultipleChoice.getModelValue(), but they 
> can't be resolved by overriding this method in subclass because this method 
> declared final.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to