我想用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.


有什么问题?

最佳答案

Tapestry告诉您包含FormTestComponent的组件具有值为“ null”的属性“ name”。因此,您的问题不在您的TestComponent中,而是更高的一个组件/页面。为名称分配一个值,您应该会很好。

编辑

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

10-08 11:45