准备未在Tapestry中调用的提交事件

时间:2016-05-23 15:24:12

标签: forms tapestry

我在Tapestry组件的tml文件中有一个表单。

...
<t:form t:id="searchForm" clientValidation="none">
    ....
    <t:select t:id="globalSport" model="globalSportModel" value="formData.globalSportId" blankOption="never"/>
    ....
</t:form>
..

这是相应Java文件的重要部分:

...
@Property(read = true, write = false)
private ServiceSearchFormData formData;
...
@OnEvent(value = EventConstants.PREPARE_FOR_SUBMIT, component = "searchForm")
void prepareForSubmit()
{
    formData = new ServiceSearchFormData();
}
...

这似乎非常简单。 ServiceSearchFormData是一个DTO,具有很少的属性和getter / setter方法。它封装了表单中提交的数据。在&#34;上准备提交实例&#34;事件。 ......它工作正常。

但是,偶尔会在生产环境中抛出异常。我无法重现它。它发生在将数据提交到此表单的POST请求范围内。异常消息指出:

写入参数失败&#39;值&#39;组件MyPortal:portalindex.portalsearchform.globalsport:Property&#39; formData&#39; (在属性表达式中,#cc.ftm.fitsoftware.webapp.components.PortalSearchForm@3262579e的formData.globalSportId&#39;)为空。

怎么可能?财产formData如何未初始化?这种罕见(但常规)的异常是否可能是由POST请求的t:formdata参数的格式错误造成的?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

基于这一点,我可以看到,我会尝试两件事来缩小问题范围

  1. 我会删除component = "searchForm"限定符

    @OnEvent(value = EventConstants.PREPARE_FOR_SUBMIT)
    void prepareForSubmit()
    {
        formData = new ServiceSearchFormData();
    }
    
  2. 我会删除所有其他的@OnEvent注释,看看是否有任何人吞下这个事件:

    //@OnEvent(...) 
    void foo() {...}