【问题标题】:Error reporting from a LoadableDetachableModel doesn't work来自 LoadableDetachableModel 的错误报告不起作用
【发布时间】:2015-01-11 16:50:12
【问题描述】:

如果加载模型时发生错误,向用户展示该错误的正确方法是什么?似乎向页面添加反馈组件并使用 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>

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

【问题讨论】:

    标签: wicket wicket-6


    【解决方案1】:

    我不确定什么是“最佳”方式,但您可以在 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);
        }
      }
     }
    

    【讨论】:

    • Session#error() 就是这样。如果不使用 Wicket 1.4(或更早版本)代码示例,我会 +1 答案。因为这是 Wicket 6.x,所以使用 IRequestCycleListener#onException()。
    • 从 error() 切换到 Session.get().error() 确实可以防止抛出“无法修改组件层次结构”异常,但它没有出现在我的 FeedbackPanel 中。如何让会话错误消息显示在模型加载失败的页面上?
    • 关于为什么 Session,get.error() 没有显示在我的反馈组件中的任何想法?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2012-05-08
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多