为什么 primefaces 数据表无法访问包含列表 <Object> 的列表<Object> 中的变量

Why the primfaces datatable cant access the variable in a list<Object> that contains a list<Object>

我的错误是我无法从数据表的列中的 class 部分访问变量

public class Blueprint  implements Serializable {
    private String name;
    private List<Part> parts;
    
    public Blueprint(String name, List<Part> parts) {
        this.name = name;
        this.parts = parts;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Part> getParts() {
        return parts;
    }

    public void setParts(List<Part> parts) {
        this.parts = parts;
    }

public class Part implements Serializable{

    public Part(String name, Integer amount) {
        this.name = name;
        this.amount = amount;
    }
    public String name;
    public Integer amount;

    public String getName() {
        System.out.println(name);
        return name;
    }

    public void setName(String _Name) {
        this.name = _Name;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmoung(Integer _Amount) {
        this.amount = _Amount;
    }


<p:panelGrid columns="1">

                        <p:dataTable id ="BlueprintList" value="#{Blueprints.blueprints}" var="blueprint" rowKey="#{blueprint.name}"  selectionMode="single" selection="#{Blueprints.selectedPart}">
                            <p:column style="width:16px">
                                <p:rowToggler />
                            </p:column>
                            <p:column headerText="Name">
                                <p:outputLabel value="#{blueprint.name}"/>
                            </p:column>

                            <p:rowExpansion>
                                <p:panelGrid columns="1"  >
                                    <p:dataTable value="#{blueprint.parts}" var="a">
                                        <p:column headerText="Name>
                                                <p:outputLabel value="#{a}" />
                                            </p:column>
                                            <p:column headerText="Anzahl">
                                                <p:outputLabel value="#{a}"/>
                                            </p:column>
                                   
                                    </p:dataTable>
                                </p:panelGrid>
                            </p:rowExpansion>
                            
                        </p:dataTable>

问题是当我想通过 var a 访问名称和数量时它没有显示,如果我手动编写它,它不起作用。

我希望有人能帮助我。谢谢

对于外部数据表,selection="..." 子句需要引用蓝图,因为 value="..." 子句是蓝图列表。要获得所选部分,您还需要在内部数据表中包含选择子句。

在使用变量 {a} 的地方,您应该能够像 #{a.name} 和 #{a.amount} 中那样包含字段名称。您没有说明您使用的是哪个版本的 Primefaces 或什么开发工具,但在我的 NetBeans v12.2 版本中,Netbeans 在这种情况下不会自动执行字段名称查找。我只需要手动输入,忽略警告三角。

我在使 selectedPart 工作时遇到问题,可能是因为我的页面上没有用于提交表单的命令按钮。我用 p:ajax 标签解决了它。

这是我的版本。我在 Wildfly 21 上使用 Primefaces 8、运行 并使用 Java 11.

对其进行了测试
<h:form>

    <p:dataTable id ="BlueprintList" value="#{rowExpansionController.blueprints}" 
                 var="blueprint" 
                 rowKey="#{blueprint.name}"  
                 selectionMode="single" selection="#{rowExpansionController.selectedBlueprint}"
                 rowExpandMode="single">
        <p:ajax event="rowSelect" listener="#{rowExpansionController.rowSelectBlueprint}" />
        <p:column style="width:16px">
            <p:rowToggler  />
        </p:column>
        <p:column headerText="Name">
            #{blueprint.name}
        </p:column>

        <p:rowExpansion>
            <p:dataTable value="#{blueprint.parts}" var="part" 
                         rowKey="#{part.name}" selectionMode="single" 
                         selection="#{rowExpansionController.selectedPart}">
                <p:ajax event="rowSelect" listener="#{rowExpansionController.rowSelectPart}" />
                <p:column headerText="Name">
                    #{part.name}
                </p:column>
                <p:column headerText="Amount">
                    #{part.amount}
                </p:column>

            </p:dataTable>
        </p:rowExpansion>

    </p:dataTable>

</h:form>