【问题标题】:f:setPropertyActionListener sets null value instead of intended valuef:setPropertyActionListener 设置空值而不是预期值
【发布时间】:2011-11-14 01:34:26
【问题描述】:

我的看法是:

<h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
   <f:setPropertyActionListener target="#{bookSeatController.flightNumber}" 
                  value="#{flightInfoController.flight.number}" />
</h:commandLink>

我的二传手是:

public void setFlightNumber(String flightNumber) {
   this.flightNumber = flightNumber;
}

当我使用调试器时,我在 setter 中得到 flightNumbernull。但是,如果我将视图更改为以下内容:

<h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
   <f:setPropertyActionListener target="#{bookSeatController.flightNumber}" 
                  value="122334" />
</h:commandLink>

flightNumber 属性设置为 122334。这是如何引起的,如何解决它以设置预期值而不是 null

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    如果#{flightInfoController.flight.number} 是请求范围的,那么它必须在处理表单提交的请求期间保留与显示表单请求期间完全相同的flight。这必须发生在 bean 的(后)构造函数中。

    如果这不是一个选项,因为它依赖于一些基于请求的变量,那么你最好的选择是将 bean 放在视图范围内(但我仍然假设你的 bean 设计正确,它不这样做getter 中的任何业务/预加载工作)。

    如果将 bean 放入视图范围又不是一个选项,那么您需要将它作为一个完整的请求参数传递。您可以通过&lt;f:param&gt; 进行操作。

    <h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
       <f:param name="flightNumber" value="#{flightInfoController.flight.number}" />
    </h:commandLink>
    

    您可以让 JSF 在BookSeatController 中通过@ManagedProperty 或在当前视图中通过&lt;f:viewParam&gt; 设置它。

    另见:

    【讨论】:

    • 感谢您的帮助,见上文。
    【解决方案2】:

    如果它在分配“122334”时工作,但在分配flightInfoController.flight.number时它是“null”,并且由于您没有收到任何异常,那么这意味着您的flightInfoController可能没有正确初始化(关于它的字段flight和因此numberflight)。

    只需确保 bean 已正确初始化(或使用 bean 代码更新您的 OP)。

    【讨论】:

    • Bean 是请求范围,因此值被初始化为 null。将策略切换为使用以下内容:
    • @ScottM:很高兴您的问题得到了解决。但看起来 BalusC 的回答对解决问题很有帮助,所以你应该接受他的回答。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多