Tapestry 子窗体中的应用程序异常 - 参数绑定为 null

Posted

技术标签:

【中文标题】Tapestry 子窗体中的应用程序异常 - 参数绑定为 null【英文标题】:Application Exception in tapestry subforms - Parameter is bound to null 【发布时间】:2013-09-01 00:35:50 【问题描述】:

我想用tapestry5创建一个子表单:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">

    <t:TextField t:id="name" />
</html>

并像这样使用它:

<form t:type="form" t:id="testForm">
    <t:testComponent name="name" />
    <input type="submit"/>
</form>

TestComponent.java:

import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;

public class TestComponent 

    @Parameter(required = true, allowNull = false)
    @Property
    private String name;

这样我就可以使用 'name' 的值,例如:

@Property
private String name;

void onSuccessFromTestForm() 
    System.out.println(name);

但我得到的只是一个应用程序异常:

Render queue error in BeginRender[Index:testcomponent.name]: Failure reading parameter 'value' of component Index:testcomponent.name: Parameter 'name' of component Index:testcomponent is bound to null. This parameter is not allowed to be null.

有什么问题?

【问题讨论】:

【参考方案1】:

Tapestry 告诉您,包含您的 Form 和您的 TestComponent 的组件有一个值为 null 的属性“name”。所以你的问题不在于你的TestComponent,而是一个组件/页面更高。为 name 分配一个值,你应该很好。

编辑

如果您的意思是允许人们通过您的表单分配一个值并在呈现页面时允许空值,请从您的@Parameter 中的TestComponent 中删除allowNull = false。我假设您想强制用户在提交表单之前为 name 字段提供一个值。这是通过添加t:validate="required" 属性在输入字段上完成的,而不是在@Parameter 上。 @Parameter 告诉 Tapestry 实例变量如何与其容器交互,它没有说明变量如何在其自己的组件中使用。

【讨论】:

但我不想为“名称”赋值。用户应该在表单/子表单中输入“名称”的值,然后我想使用这个值 - 例如 System.out.println(name); 我根据您的评论更改了答案。您似乎对@Parameter 的使用有所误解。【参考方案2】:

@Parameter 注释就像是构造函数的参数。基本上,你的代码在说,像

public TestComponent(String name)
  if(name == null) thrown new Exception("No Nulls in here boy");

你这样做很好,它可以防止 NullPointers 以防你想在组件中进行一些处理,并且搜索 NPE 的根是世界上最烦人的事情。更重要的是,您将 required 设置为 true,这意味着您必须将一些值传递给组件。您必须将 name 变量初始化为某些东西,空字符串就足够了,因为它不会弄乱您想要实现的行为,但会满足挂毯。

这将解决您当前遇到的技术问题。至于您的真正问题,通过验证,就像提到的 joostschouten 一样,您需要设置验证规则。有几种方法可以实现这一点,请像提到的 joostschouten 一样添加 t:validate 或在组件中添加 onValidateFromName(String name) throws ValidationException...。对于这种简单的验证,第二种方法有点矫枉过正,但对于更复杂的验证可能是必要的

关于该主题的一些参考资料:

http://tapestry.apache.org/forms-and-validation.html http://tapestry.apache.org/component-parameters.html http://jumpstart.doublenegative.com.au/jumpstart/examples/input/validators http://jumpstart.doublenegative.com.au/jumpstart/examples/input/morevalidation

【讨论】:

以上是关于Tapestry 子窗体中的应用程序异常 - 参数绑定为 null的主要内容,如果未能解决你的问题,请参考以下文章

带有主窗体参数的子窗体

Tapestry 应用程序中的会话超时 AJAX 错误

使用导航子窗体上的控件访问查询参数

delphi 子窗体如何继承主窗体的方法

子窗体中的子窗体控件

基于主窗体中的字段访问2007过滤器子窗体?