禁用组件时出现Wicket ListenerNotAllowedInvocationException

时间:2018-07-17 20:32:00

标签: java ajax exception wicket wicket-7

我有一个{ "name": "BURGER KING", "phone": "+(1)-(403)-2153451", "categories": ["fast food", "restaurant"], "classifications": [ { "code": "RESTAURANT", "names": [ { "nameLocale": "en-US", "name": "restaurant" }, { "nameLocale": "en-US", "name": "fast food" } ] } ], "location": "51.06652,-114.10822" } "msg":"Error parsing JSON field value. Unexpected OBJECT_START at [122], field=classifications" ,上面有两个DropDownChoice。当我选择应设置为OnChangeAjaxBehavior的值2时,在显示DropDownChoice之前将第二次禁用,并在服务器日志中看到AccessDeniedPage。在Wicket 6和7中有此功能。

有什么解决方法吗?

以下代码:

选择了私有整数;

ListenerNotAllowedInvocationException

我尝试禁用与组件具有相同条件的行为之一,但是我没有用。

public HomePage(final PageParameters parameters) {
    super(parameters);
    final DropDownChoice<Integer> ddc = new DropDownChoice<Integer>("ddc", new PropertyModel(this, "selected"), Arrays.asList(1,2,3)){
        @Override
        protected void onConfigure() {
            super.onConfigure(); 
            setEnabled(!Objects.equals(getModel().getObject(), 2));
        }

    };
    ddc.add(new OnChangeAjaxBehavior() {
        @Override
        protected void onUpdate(AjaxRequestTarget art) {
            art.add(getComponent()); 
            saveToDb(model.getObject);
        }
    });
    ddc.add(new OnChangeAjaxBehavior() {
        @Override
        protected void onUpdate(AjaxRequestTarget art) {
            art.add(getComponent(), otherComponent);
        }

    });
    ddc.setOutputMarkupId(true);
    add(ddc);
}

或者这样:

    @Override
    public boolean isEnabled(Component component) {
        return !Objects.equals(component.getDefaultModelObject(), 2);
    }

1 个答案:

答案 0 :(得分:0)

问题如下:

  • 第一个Ajax调用将模型对象更新为2,并在禁用状态下重新渲染DropDownChoice
  • 然后执行第二个Ajax调用,并且Wicket禁止更新,因为该组件已禁用

为什么您需要在同一DropDownChoice上使用2个OnChangeAjaxBehaviors?

一种解决方案是通过对两种Ajax行为都使用AjaxChannel.ACTIVE来防止第二次Ajax调用。如果此ajax通道上有活动的Ajax调用,这将告诉Wicket JS不执行第二个Ajax调用。

更新: 另一种方法是重写Behavior#isEnabled()并检查是否存在名称为ddChoice#getInputName()的请求参数,并且其值为2。如果是这种情况,则返回true,否则调用super.isEnabled()。 / p>