我有一个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
参数值不正确引起的吗?
谢谢你的帮助。
基于我所能看到的,我会尝试两件事来缩小问题范围:
-
我将删除
component = "searchForm"
限定符@OnEvent(value = EventConstants.PREPARE_FOR_SUBMIT) void prepareForSubmit() { formData = new ServiceSearchFormData(); }
-
我会删除所有其他@OnEvent注释,看看是否有任何注释吞噬了这个事件:
//@OnEvent(...) void foo() {...}