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



我有一个Tapestry组件的html文件形式。

...
<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方法。它封装了表单中提交的数据。在"准备提交"事件中创建了一个实例。。。而且效果很好。

但是,偶尔会在生产环境中抛出异常。我无法复制它。它发生在向该表单提交数据的POST请求范围内。异常消息状态为:

写入组件MyPortal的参数"value"失败:portalindex.portalsearchform.globalsport:属性"formData"(在属性表达式"formData.globalSportId"内,共cz.ftm.fitsoftware.webapp.components.PortalSearchForm@3262579e)为null。

这怎么可能?如何取消初始化属性formData?这种罕见(但有规律)的异常会是由POST请求的t:formdata参数值不正确引起的吗?

谢谢你的帮助。

基于我所能看到的,我会尝试两件事来缩小问题范围

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

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

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

最新更新