我有一个带有自定义模型的组件(扩展 wicket 标准模型类)。当 Wicket 调用时,我的模型从数据库/Web 服务加载数据getObject()
.
此查找可能会因多种原因而失败。我想通过在带有该组件的网页上显示一条不错的消息来处理此错误。最好的方法是什么?
public class MyCustomModel extends Model {
@Override
public String getObject() {
try {
return Order.lookupOrderDataFromRemoteService();
} catch (Exception e) {
logger.error("Failed silently...");
// How do I propagate this to the component/page?
}
return null;
}
请注意,会发生错误inside与组件分离的模型。
处理模型的 getObject() 中发生的异常很棘手,因为此时我们通常处于整个请求周期的响应阶段,并且更改组件层次结构为时已晚。因此,处理异常的唯一位置非常非本地,不是靠近组件或模型的任何地方,而是在RequestCycle
.
不过,有一种方法可以解决这个问题。我们使用一个组合Behavior
and an IRequestCycleListener
处理这个问题:
-
IRequestCycleListener#onException
允许您检查请求期间引发的任何异常。如果您返回一个IRequestHandler
从这个方法中,该处理程序将被运行并呈现,而不是之前发生的任何其他事情。
我们单独使用它来捕获像 Hibernate 这样的通用内容StaleObjectException
将用户重定向到通用的“其他人修改了您的对象”页面。如果你
-
对于更具体的情况,我们添加RuntimeExceptionHandler
行为:
public abstract class RuntimeExceptionHandler extends Behavior {
public abstract IRequestHandler handleRuntimeException(Component component, Exception ex);
}
In IRequestCycleListener
我们遍历当前页面的组件树以查看是否有任何组件具有以下实例RuntimeExceptionHandler
。如果我们找到一个,我们称其为handleRuntimeException
方法,如果它返回一个IRequestHandler
这就是我们将要使用的。这样您就可以实际处理页面本地的错误。
Example:
public MyPage() {
...
this.add(new RuntimeExceptionHandler() {
@Override public IRequestHandler handleRuntimeException(Component component, Exception ex) {
if (ex instanceof MySpecialException) {
// just an example, you really can do anything you want here.
// show a feedback message...
MyPage.this.error("something went wrong");
// then hide the affected component(s) so the error doesn't happen again...
myComponentWithErrorInModel.setVisible(false); // ...
// ...then finally just re-render this page:
return new RenderPageRequestHandler(new PageProvider(MyPage.this));
} else {
return null;
}
}
});
}
注意:这是notWicket 附带的东西,我们自己推出。我们简单地结合了IRequestCycleListener
and Behavior
Wicket 的功能就是想出这个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)