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

Fabian T. commented on WICKET-6410:
-----------------------------------

Hello Martin,

Thx for your reply.
Indeed id is just null when null values are allowed in the choice. Sorry I 
forgot to mention this.

Let me try to explain it with the screenshot and some code:

{code:java}
final IModel<List<ABC>> list = new AbstractReadOnlyModel<List<ABC>>() {
        @Override
        public List<ABC> getObject() {
                List<ABC> list = some dao with to much SQL. Just used to fill 
the dropdown with some initial data.
                return list;
        }
};

final DropDownChoice<ABC> choice = new DropDownChoice<ABC>(some wicket id, 
someModel.<ABC>bind("abc"), list);
{code}

No magic here. The problem occurs after pressing submit (still no selected 
element in this dropdown). Please have a look on the screenshot. As you can see 
it’s just a simple submit, Wicket runs the validators and tries to bind the 
selected value with the model object. 

On the top, the breakpoint @ VeranstaltungenPage… line 1122: this is the 
getObject method with the bigger sql.

3 lines deeper in the stacktracke, we are in the ChoiceRenderer class, line 161 
(List<? extends T> _choices = choices.getObject();)

Since the user didn’t select anything in the dropdown (id = null), we’re going 
the leave the ChoiceRenderer# getObject with null anyway. So the call on 
IModel#getObject isn’t necessary here.

So my question, why do we need to call IModel#getObject of our dropdown? 

Why not just check the id and if it’s null or empty just return null?
if (StringUtils.isBlank(id)) {
        return null;
}

Since I’m not a very experience wicket dev, I’m maybe missing something 
somewhere :-)


> ChoiceRenderer getObject always calls IModel#getObject when id is null
> ----------------------------------------------------------------------
>
>                 Key: WICKET-6410
>                 URL: https://issues.apache.org/jira/browse/WICKET-6410
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 7.1.0
>            Reporter: Fabian T.
>            Priority: Trivial
>         Attachments: debug_Screenshot.png
>
>
> {code:java}
> @Override
>       public T getObject(String id, IModel<? extends List<? extends T>> 
> choices)
>       {
>               List<? extends T> _choices = choices.getObject();
>               for (int index = 0; index < _choices.size(); index++)
>               {
>                       // Get next choice
>                       final T choice = _choices.get(index);
>                       if (getIdValue(choice, index).equals(id))
>                       {
>                               return choice;
>                       }
>               }
>               return null;
>       }
> }
> {code}
> This Methode always calls „choices.getObject();”, even if the id is null or 
> empty.
> In our project we got some bigger SQL Statements behind some getObject 
> methods of different dropDownChoices. Avoiding to call getObject when the id 
> is null or empty increases the performance.
> Feel free to correct me if I mess up something else with this fix.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to