0

私はこの "Base is null: item" jsf1.1 エラーをデータテーブルで取得していますが、これはまったく理解できませんでした。これは 2 レベルのデータ テーブルであり、2 番目のレベルのデータ テーブルでエラーが発生しています。第 1 レベルのデータ テーブルは、ArrayList deviceListDeviceReferences の値にバインドされます。このデータテーブルには、別のデータテーブルを含む列があります。この第 2 レベルのデータテーブルは、ArrayList holderNameMasks の値にバインドされます。この値は、基本的に最初のデータテーブルの行項目である DeviceReferenceJTO から取得しました。

以下は、html のスニペットです。

<h:dataTable border="0" cellspacing="0"
    value="#{deviceReferenceBean.deviceListDeviceReferences" var="item"  
    rendered="#{not empty deviceReferenceBean.deviceListDeviceReferences }"  
    binding="#{deviceReferenceBean.deviceListDeviceReferencesTable}"
>
    <h:column>
        <h:outputText value="Holder Name:" />
        <!--  device heading -->
        <h:outputText value="#{item.deviceLabel }" styleClass="DeviceReferenceTitleBarBorder" style="width:100%; height:30px; background-color:#f9f9f9"/>
        <!-- holder name -->   
        <h:panelGrid columns="2" rendered="#{item.hasHolderNameMasks}" >
            <h:outputText value="Holder Name:" />
            <h:dataTable border="0" cellspacing="0" 
                value="#{item.holderNameMasks}" var="holderMaskItem"  
                rendered="#{not empty deviceReferenceBean.deviceListDeviceReferences and item.hasHolderNameMasks}"  
                binding="#{item.holderNameMasksTable}"
            >
                <h:column>
                    <h:outputText value="#{holderMaskItem.fieldLabel}" />
                </h:column>
                <h:column>
                    <h:panelGrid columns="1">
                        <h:inputText value="#{holderMaskItem.fieldValue}" />
                        <h:outputText value="#{holderMaskItem.instruction }" rendered="#{holderMaskItem.hasInstruction"/>
                    </h:panelGrid>
                </h:column>
            </h:dataTable>
        </h:panelGrid>  
    </h:column>
</h:dataTable>

以下は、コンポーネントの外観です。

<HtmlForm enctype="application/x-www-form-urlencoded" id="_idJsp323" rendered="true" styleClass="MAForm" submitted="false" transient="false">

    <HtmlDataTable border="0" cellspacing="0" first="0" id="_idJsp324" rendered="#{not empty deviceReferenceBean.deviceListDeviceReferences }=true" rowIndex="-1" rows="0" transient="false" var="item" binding="#{deviceReferenceBean.deviceListDeviceReferencesTable}">

        <UIColumn id="_idJsp325" rendered="true" transient="false">

            <HtmlOutputText escape="true" id="_idJsp326" rendered="true" style="width:100%; height:30px; background-color:#f9f9f9" styleClass="DeviceReferenceTitleBarBorder" transient="false"/>

            <HtmlPanelGrid border="-2147483648" columns="2" id="_idJsp327" rendered="#{item.hasHolderNameMasks}=true" transient="false">

                <HtmlOutputText escape="true" id="_idJsp328" rendered="true" transient="false" value="Holder Name:"/>

            </HtmlPanelGrid>

        </UIColumn>

    </HtmlDataTable>

</HtmlForm>
4

1 に答える 1

1

犯人はここにいます:

<h:dataTable
    binding="#{item.holderNameMasksTable}"
>

UI コンポーネントのbinding(およびid) 属性は、ビューのビルド時 (JSF が XHTML ファイルを解析してコンポーネント ツリーにする瞬間) に解決されます。ただし、#{item}ビューのレンダリング時 (JSF がコンポーネント ツリーを HTML 出力にエンコードする瞬間) にのみ使用できます。したがって、使用している場所binding="#{item.xxx}"は常に失敗し#{item}ますnull。これはまさに例外が伝えようとしていることに注意してください。

2 つのオプションがあります。

  1. binding属性を完全に取り除きます。
  2. 代わりにバインドし#{deviceReferenceBean}ます。ビューのビルド時に使用できます。

以下も参照してください。

于 2013-05-20T12:32:44.013 に答える