Wicket
  1. Wicket
  2. WICKET-3764

Ajax behaviors are failing in stateless pages

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.5-RC4
    • Fix Version/s: 1.5-RC5
    • Component/s: wicket
    • Labels:
      None

      Description

      Stateless ajax behaviors are not working in stateless pages in 1.5-RC4.2. I verified it with the stateless demo project of Martin Grigorov (https://github.com/martin-g/wicket-stateless), when changing the dropdown on the start page an exception is thrown (clicking the increment link causes a similar exception):

      org.apache.wicket.behavior.InvalidBehaviorIdException: Cannot find behavior with id: 0 on component: [DropDownChoice [Component id = c]]

      At first glance the reason may be located in org.apache.wicket.Behaviors.getBehaviorById() which does not create the ID list if missing (getBehaviorsIdList(false) in line 286 instead of getBehaviorsIdList(true)), because this error does not occur when getBehaviorId() was manually called in the page constructor to force creation of the list.

      1. WICKET-3764.patch
        3 kB
        Martin Grigorov

        Activity

        Hide
        Martin Grigorov added a comment -

        Here is the proposed patch.
        The only needed call is "getBehaviorId(behavior)" in #internalAdd(Behavior). Everything else is optimization.

        The drawback is that now we add BehaviorIdList to the data of each component with a behavior, non-lazy.
        If this is OK then we just need to regenerate the expected html for few tests.

        Show
        Martin Grigorov added a comment - Here is the proposed patch. The only needed call is "getBehaviorId(behavior)" in #internalAdd(Behavior). Everything else is optimization. The drawback is that now we add BehaviorIdList to the data of each component with a behavior, non-lazy. If this is OK then we just need to regenerate the expected html for few tests.
        Hide
        Igor Vaynberg added a comment -

        the patch defeats the point of optimization and the point of really being stateless. i think the hit by removing this optimization will be too great.

        instead, ajax behaviors should call component.getbehaviorid(this) in bind to force the creation of the id when they are added to the component. but that fix is outside of wicket.

        i suppose what we can do is provide behavior#isstateless() which can do the above if true, but im not sure of the value...martin if you want to implement isstateless() go ahead but you will still need to tweak your stateless behaviors to override that and return true.

        Show
        Igor Vaynberg added a comment - the patch defeats the point of optimization and the point of really being stateless. i think the hit by removing this optimization will be too great. instead, ajax behaviors should call component.getbehaviorid(this) in bind to force the creation of the id when they are added to the component. but that fix is outside of wicket. i suppose what we can do is provide behavior#isstateless() which can do the above if true, but im not sure of the value...martin if you want to implement isstateless() go ahead but you will still need to tweak your stateless behaviors to override that and return true.
        Hide
        Igor Vaynberg added a comment -

        i implemented behavior#isstateless fwiw

        Show
        Igor Vaynberg added a comment - i implemented behavior#isstateless fwiw
        Hide
        Martin Grigorov added a comment -

        I'll change later my github project and test it. If everything is OK I'll move it to wicketstuff/core and change the resolution of this ticket.

        Show
        Martin Grigorov added a comment - I'll change later my github project and test it. If everything is OK I'll move it to wicketstuff/core and change the resolution of this ticket.
        Hide
        Martin Grigorov added a comment -

        Looking at it I see we already have getStatelessHint(Component) there.
        This can be used too.
        Let's see...

        Show
        Martin Grigorov added a comment - Looking at it I see we already have getStatelessHint(Component) there. This can be used too. Let's see...
        Hide
        Martin Grigorov added a comment -

        Using getStatelessHint() works.
        All Ajax behaviors provided by Wicket are stateful already.

        Show
        Martin Grigorov added a comment - Using getStatelessHint() works. All Ajax behaviors provided by Wicket are stateful already.

          People

          • Assignee:
            Martin Grigorov
            Reporter:
            Heribert Hirth
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development