我想用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告诉您包含Form
和TestComponent
的组件具有值为“ null”的属性“ name”。因此,您的问题不在您的TestComponent
中,而是更高的一个组件/页面。为名称分配一个值,您应该会很好。
编辑
如果要允许人们通过您的表单分配值,并且在呈现页面时允许使用空值,请从allowNull = false
中的@Parameter
中删除TestComponent
。我假设您要强制用户在提交表单之前为name字段提供一个值。通过添加t:validate="required"
属性而不是@Parameter
在输入字段上完成此操作。 @Parameter
告诉Tapestry实例变量如何与其容器交互,它没有说明该变量如何在其自己的组件中使用。