【问题标题】:Getting a null value passed to a Java function via BootsFaces datatable通过 BootsFaces 数据表获取传递给 Java 函数的空值
【发布时间】:2019-04-13 12:08:38
【问题描述】:

我正在尝试创建一个模式来将用户选择的请求发送到电子邮件地址;但是,我无法获取用户选择的请求。我不断得到通过fooBean.setSelected(id) 传递的空值。


版本:

  • BootsFaces:1.3.0
  • Java:1.8.0
  • JSF:2.0
  • 浏览器:Internet Explorer 11.2x

thisThing.xhtml 的 MCVE:

<b:dataTable value="#{fooBean.newRequests}"
    var="foo"
    onselect="ajax:fooBean.setSelected(id)"
    ondeselect="ajax:fooBean.setSelected(id)"
    selectedItems="row"
    selection-mode="multiple"
    selectedRows="#{foo.selected}"
    saveState="false">

    <b:dataTableColumn label="Select">
        <b:selectBooleanCheckbox value="#{foo.selected}" />
    </b:dataTableColumn>

    <b:dataTableColumn label="Status" value="#{foo.status}" />

    <b:dataTableColumn label="Request Number"
        value="#{foo.requestNumber}"
        data-type="string" />

    <b:dataTableColumn label="ID" value="#{foo.id}" />

    <b:dataTableColumn value="#{foo.storeName}"
        label="Store Name" />
</b:dataTable>

fooBean.java 的 MCVE:

@ManagedBean(name="fooBean")
@ViewScoped
public class fooBean extends BeanBase implements Serializable {
    
    private List<FooRecord> fooRecords = new ArrayList<FooRecord>();
    private List<FooRecord> selectedFooRecords = new ArrayList<FooRecord>();
    
    // ...
    
    public void setSelected(String requestId) {
        // This is not how I really do it, but it gives an idea
        // with what I intend to do.
        this.fooRecords.stream().filter(...).toggleSelection();
        this.selectedFooRecords.stream().filter(...).toggleSelection();
    }
}

更新:

我发现我的方法称为getSelect 而不是getSelected,所以我修复了它,这部分完成了。我只记得真正的问题,这就是为什么传递的是空参数而不是 requestId。当我通过fooBean.getSelected(String requestId) 进行调试时,它显示null 作为参数传递。我什至尝试过:

<!-- Using varName.property -->
onselect="ajax:fooBean.setSelected(foo.id)"

<!-- Using just the property name -->
onselect="ajax:fooBean.setSelected(id)"

<!-- Using the loop variable -->
onselect="ajax:fooBean.setSelected(foo)"

更新 2:

如何将foo.id 传递给函数?

【问题讨论】:

标签: jsf datatable bootsfaces


【解决方案1】:

只有三个参数可以传递给 bean 方法:

  • 循环变量。在您的示例中,这是foo。仅当属性 selected-items 设置为 rows 时,此参数才有效。警告:如果您激活列或单元格选择模式,此参数仍会传递给服务器,并且似乎是有效的。只是这个对象的每个属性都是空的。
  • typeOfSelection。这是"row""column""item"。它决定了用户选择了什么。这又由属性 selected-items 确定,因此您几乎不必使用此参数。只需从参数列表中省略它即可。
  • indexes 告诉 JSF bean 选择了哪些行、列或单元格。请注意,在前两种情况下,这是一个单独的数字,或者 - 如果选择了多个项目 - 一个逗号分隔的列表。如果您设置了 selected-items="cell",则索引是以逗号分隔的对象列表,其中包含行和列索引。

我想indexesfoo 是您的案例中最有用的参数。

最后的评论:我们想增加更多的灵活性,但这需要比我们更多地了解 JSF 的内部 API。说实话,我什至不确定我们是否可以在不修改 JSF 引擎本身的情况下传递任意 bean 值。如果有人知道怎么做,请在our bug tracker留言。

更新: 也许问题是由模态引起的。模式在加载时呈现,但稍后在用户选择一行时显示。问题是,除非您将模态的内容添加到 update 属性,否则模态不会自动重新呈现。

【讨论】:

  • 如果您遇到问题,请随时联系我们(webmast1 at beyondjava dot de)。否则,请随时支持我的答案。 :)
  • 我尝试通过循环变量本身,我仍然得到null 传回。 :-\
  • 也许更好的问题是:我希望 fooBean 存储选定的行,以便我可以使用它通过电子邮件发送集合。 额外问题是我怎样才能让用户单击一个按钮来全选/取消全选? 我觉得答案很明显,但我最近一直很难理解它。
  • 我会发邮件给你,但我不能在工作中向外部人员发送邮件(尽管我可以在这里发布非敏感的 MCVE……有点讽刺)。
  • 我假设您已经在我们的错误跟踪器上打开了错误代码。问题是相似的。滚动到this discussion 的末尾以查找解决方案。希望对您有所帮助!
猜你喜欢
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2012-07-29
  • 2017-09-23
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多