在使用Tapestry将Web GUI创建为表示层时,我对如何处理和处理由我的域对象引发的已检查异常存在一些困境。
假设我有一个域对象,Foo
会在其某个方法上抛出FooException
:
public class Foo {
...
public void fooMethod throws FooException() {
...
}
...
}
现在,假设我有一个名为Bar
的Tapestry页面,其中Foo
对象正在使用BeanEditor
进行编辑。
现在,为了确保非法值不会传递给BeanEditor
以创建Foo
对象,我可以考虑两种基本方法:
使用@Validate
注释
在这种情况下,如果我们可以通过正则表达式过滤和检查输入,或限制值或执行@Validate
提供的类似操作,我们将在我们正在编辑的字段旁边收到一条漂亮的错误消息提交将失败,从而使用户思考他在那里写的内容以及如何解决它。
捕获域异常并根据它执行操作
我认为这种情况提供了更多关于可以做什么和不可以做什么的选择。例如,如果使用者需要输入URL
并且在执行此操作时出错,则URL
构造函数将抛出自己的MalformedURLException
。我们可以在Java代码中捕获该异常,但我的问题是,下一步该做什么以及如何做?
Tapestry是否提供了处理域异常(已检查和/或未检查)的任何特殊机制,而不是在事情分解时弹出的异常窗口?
有没有关于如何解决这个特定问题的模式?
您在哪里绘制常见异常和普通异常之间的限制,例如IndexOutOfBoundsException
和某些特定于域的异常,例如FooException
?
:d
答案 0 :(得分:2)
最好的方法是将验证应用于字段。一种方法是使用@Validate。另一个是通过添加tapestry-beanvalidator来使用Bean Validation(JSR 303)注释,这在此处解释:http://tapestry.apache.org/bean-validation.html。
此外,在Tapestry中,所有表单字段组件在将值应用于属性之前触发“验证”事件。
http://tapestry.apache.org/forms-and-validation.html解释了这一切。例如,假设您有一个t:id为“count”的表单字段,您可以通过声明一个事件处理程序方法来验证它:
void onValidateFromCount(Integer value) throws ValidationException {
if (value == 13) throw new ValidationException("Thirteen is an unlucky number.");
}