从LoadableDetachableModel报告错误不起作用

时间:2015-01-11 16:50:12

标签: wicket wicket-6

如果在加载模型时发生错误,向用户提供该错误的正确方法是什么?这似乎是在页面中添加反馈组件并使用error()是正确的方法,但是当我这样做时,我收到此错误:

Caused by: org.apache.wicket.WicketRuntimeException: Cannot modify component hierarchy after render phase has started (page version cant change then anymore)
    at org.apache.wicket.Component.checkHierarchyChange(Component.java:3572)
    at org.apache.wicket.Component.addStateChange(Component.java:3501)
    at org.apache.wicket.Component.error(Component.java:1254)
    at com.prosc.wicket.LoadableDetachableModelErrorTest$1.load(LoadableDetachableModelErrorTest.java:21)
    at com.prosc.wicket.LoadableDetachableModelErrorTest$1.load(LoadableDetachableModelErrorTest.java:17)
    at org.apache.wicket.model.LoadableDetachableModel.getObject(LoadableDetachableModel.java:121)
    at org.apache.wicket.Component.getDefaultModelObject(Component.java:1605)

这是我的Java代码:

package com.prosc.wicket;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.LoadableDetachableModel;

public class LoadableDetachableModelErrorTest extends WebPage {
    public LoadableDetachableModelErrorTest() {
        add( new FeedbackPanel( "feedback" ) );
        add( new Label("dynamicText", new LoadableDetachableModel<String>() {
            @Override
            protected String load() {
                String result = "Hello World";
                error( "Uh oh, some imaginary problem happened" );
                return result;
            }
        }));
    }
}

这是我的HTML标记:

<html>
<body>
<div wicket:id="feedback" />
<div wicket:id="dynamicText" />
</body>
</html>

预期结果是看到一个空白页面,并向用户显示错误消息。

2 个答案:

答案 0 :(得分:0)

我不确定最好的&#39;方式,但您可以在Session上设置错误。但是您仍然需要考虑要在使用模型的组件中显示的内容。

public class LoadableDetachableModelErrorTest extends WebPage {
    public LoadableDetachableModelErrorTest() {
        add( new FeedbackPanel( "feedback" ) );
        add( new Label("dynamicText", new LoadableDetachableModel<String>() {
            @Override
            protected String load() {


                if (failure) {
                     Session.get().error( "Uh oh, some imaginary problem happened" );
                     return null;
                }
                else
                     return result;
            }
        }));
    }
}

您还可以抛出一个不错的键入Exception并使用自定义RequestCycle处理它(请参阅此处的完整信息:http://wicketinaction.com/2008/09/building-a-smart-entitymodel/

 public class MyRequestCycle extends WebRequestCycle
 {
  @Override
  public Page onRuntimeException(Page page, RuntimeException e)
  {
    if (e instanceof EntityNotFoundException)
    {
      return new EntityNotFoundErrorPage((EntityNotFoundException)e);
    }
    else
    {
      return super.onRuntimeException(page, e);
    }
  }
 }

答案 1 :(得分:0)

当Wicket开始渲染组件时,不再允许他们更改状态。

您必须检查组件的#onConfigure()中的错误。