在参数字段(ajax)上写入参数'value'空值失败

时间:2013-10-14 13:00:35

标签: ajax java-ee select tapestry zone

当我尝试更新处理事件中的组件区域时(选择框的onValueChanged),我遇到此问题。

[ERROR] TapestryModule.RequestExceptionHandler Processing of request failed with uncaught exception: Failure writing parameter 'value' of component calendar/Stereotype:daycomponent.selectcategoryactivity: Property 'day' (within property expression 'day.category', of com.hb.craproject.web.components.calendar.stereotype.AddDayStereotypeComponent@3a6b9a8a) is null.
org.apache.tapestry5.ioc.internal.OperationException: Failure writing parameter 'value' of component calendar/Stereotype:daycomponent.selectcategoryactivity: Property 'day' (within property expression 'day.category', of com.hb.craproject.web.components.calendar.stereotype.AddDayStereotypeComponent@3a6b9a8a) is null. [at classpath:com/hb/craproject/web/components/calendar/stereotype/AddDayStereotypeComponent.tml, line 24]

“Day”是这样定义的参数:

@Parameter(required=true)
@Property
private DayStereotypeBean day

当组件第一次渲染时,一切正常。只有在我尝试更改所选值时才会崩溃并给出错误消息。

我的DayComponents在我的tml页面中声明如下:

<t:loop source="week" value="dayBean">
  <tr style="border :0.1em solid blue; border-radius : 0.5em">
    <t:day t:id="dayComponent" day="dayBean" /></tr></t:loop>

所以这是Day Bean的列表。该列表在页面的setuprender事件处理程序中提供。

我不明白为什么Day参数在select组件的事件处理程序中丢失了他的引用:

public Object onValueChangedFromSelectDuree(String duree)
{    
//throwing exception, day.Day is a String, this line is just for showing you that the object doesn't exist anymore in the method, if this line is not here, the exception is throwed too because my select tml component use (like many oher components) that object
    day.getDay(); 
    return request.isXHR() ? zoneDuree.getBody() : null;
}

现在你可以看到select tml组件:​​

<t:zone t:id="zoneDuree">
        <t:select t:id="selectDuree"
            model="literal:journée,demi-journée,définir" value="day.duree"  zone="zoneDuree" /> <!-- here some fields depending of the select value --></t:zone>

任何想法都应该受到赞赏。

(抱歉我的英语不好;))

1 个答案:

答案 0 :(得分:2)

“setuprender”事件仅在最初呈现页面时触发。在setupRender()中初始化的任何内容在后续事件请求中都将为null。

以下是一些选项:

  1. 使用事件的上下文传递所有必需的上下文信息。在模板渲染之前,您需要在事件中初始化ajax块所需的任何@Parameters。
  2. 在onActivate()而不是setupRender()中初始化字段,因为onActivate()在页面呈现之前和事件处理程序之前被触发
  3. 使用@Persist在请求之间保留HTTPSession中的值。我个人讨厌这种方法,不惜一切代价避免使用HTTPSession。
  4. 您可能会发现内置的select / ajax更新是不够的,因为您无法提供多个上下文值。查看onEvent mixin here,它允许您自定义在客户端事件(例如更改)发生时从客户端传递到服务器端事件的内容。