如果在加载模型时发生错误,向用户提供该错误的正确方法是什么?这似乎是在页面中添加反馈组件并使用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>
预期结果是看到一个空白页面,并向用户显示错误消息。
答案 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()中的错误。