DataTable Composite-Component und ManyToOne

Tatsu

Mitglied
Hallo,
ich habe eine DataTable in der die Einträge einer Entity mit ManyToOne-Verknüpfung zu einer weiteren Entity angezeigt werden. Das funktioniert soweit.

Wenn ich nun die DataTable in eine Komponente auslagere funktioniert die Anzeige nur solange ich nicht auf eine Eigenschaft des Unterobjekts zugreife (ManyToOne).

Wie gekomme ich das hin, dass die Composite Component auch Eigenschaften des Unterobjekts anzeigt? Ich hoffe die Frage ist verständlich formuliert. Ich bin Java-Newbie.

Angezeigte Fehlermeldung:
Code:
/resources/ezcomp/eDataTable.xhtml @31,71 value="#{rowData[cc.attrs.test]}": The class 'de.insecma.ilm.License' does not have the property 'product.shortname'.

Beispiel ohne eigene Composite Component funktioniert:
HTML:
<p:dataTable id="tbl" var="license" value="#{licenseController.licenseList}">
                <f:facet name="header">
                    DataTable
                </f:facet>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Produkt" />
                    </f:facet>
                    <h:outputText value="#{license.product.shortname}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Datum" />
                    </f:facet>
                    <h:outputText value="#{license.createdAt}"></h:outputText>
                </p:column>
            </p:dataTable>


Das funktioniert (Verweis auf Property aus der Entity license):
HTML:
<mc:eDataTable data="#{licenseController.licenseList}" test="createdAt" />

Das funktioniert nicht (Verweis auf Property eines ManyToOne-Objekts der Entity license):
HTML:
<mc:eDataTable data="#{licenseController.licenseList}" test="product.shortname" />

Die Composite Component:
HTML:
        <!-- INTERFACE -->
        <cc:interface>
            <cc:attribute name="data" />
            <cc:attribute name="test" />
        </cc:interface>

        <!-- IMPLEMENTATION -->
        <cc:implementation>
            <p:dataTable var="rowData" value="#{cc.attrs.data}">
                <f:facet name="header">
                    DataTable
                </f:facet>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Produkt" />
                    </f:facet>
                    <h:outputText value="#{rowData[cc.attrs.test]}" />
                </p:column>
            </p:dataTable>

Die Entity-Bean:
Java:
@Entity
public class License implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @JoinColumn(name = "productId")
    @ManyToOne()
    @NotNull
    private Product product;
    @NotNull
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date createdAt;

Vielen Dank im Voraus und ein schönes Wochenende.

Bastian
 

Tatsu

Mitglied
Hallo alle zusammen,

ich habe die Idee verworfen, da ich nach einigem Lesen zu der Ansicht gekommen bin, dass es besser sein sollte die angepasste DataTable und die Columns jeweils in eine eigene Composite Component auzulagern.

Das könnte dann in etwa so aussehen:
HTML:
<mc:dataTable value="#{licenseController.licenseList}" var="row">
    <mc:column title="Produkt" value="#{row.product.shortname}"/>
    <mc:column title="Erstellt von" value="#{row.cname}"/>
</mc:dataTable>

Momentan habe ich hier noch das Problem, dass die TabellenHeader nicht mehr angezeigt werden wenn ich die Column als Composite Component einbaue. Da dies aber ein anderes Thema ist habe ich hierfür eine neues Thema aufgemacht.

Viele Grüße

Bastian
 

beachhiker

Mitglied
Hallo,

versuche für Primeface 3.x eine eigene Komponenten für dataTable und column zu schreiben. Die insertChildren Methode scheint aber wohl nicht für p:dataTable zu funktionieren.

[XML]
<mc:dataTable ....>
<mc:column .../>
<mc:column ..../>
</mc:dataTable>
[/XML]


Hat jemand schon ähnliche Erfahrungen gemacht?
 

Tatsu

Mitglied
Hallo beachhiker,

[XML]
<mc:dataTable ....>
<mc:column .../>
<mc:column ..../>
</mc:dataTable>
[/XML]
Hat jemand schon ähnliche Erfahrungen gemacht?

Ja, bei mir hat das auch nicht funktioniert.

Meine Lösung, wie folgt:

Die Tabelle

Datei: /resources/ezcomp/dataTable.xhtml
HTML:
...
      xmlns:cc="http://java.sun.com/jsf/composite"
...
        <!-- INTERFACE -->
        <cc:interface>
            <cc:attribute name="value" />
            <cc:attribute name="var" />
        </cc:interface>

        <!-- IMPLEMENTATION -->
        <cc:implementation>
            <p:dataTable id="tbl" 
                         value="#{cc.attrs.value}"
                         paginator="true" rows="10"
                         paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                         rowsPerPageTemplate="5,10,15,25,50,100,150,250,500"
                         dynamic="true">
                <c:set target="#{component}" property="var" value="#{cc.attrs.var}"/>
                <cc:insertFacet name="header" />
                <cc:insertChildren />
            </p:dataTable>
        </cc:implementation>
...

Die Tabellenzeile

Datei: web.xml
[XML]
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/ui-compositions/composition-tags.xml</param-value>
</context-param>
[/XML]

Datei: /WEB-INF/ui-compositions/composition-tags.xml
[XML]
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://www.my.facelets.component.com/jsf</namespace>
<tag>
<tag-name>column</tag-name>
<source>column.xhtml</source>
</tag>
</facelet-taglib>
[/XML]

Datei: /WEB-INF/ui-compositions/column.xhtml
HTML:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:cc="http://java.sun.com/jsf/composite"
                ...>

        <!-- Tabellenspalte mit Sotierung und Filter -->
        <c:otherwise>
            <p:column sortBy="#{value}" 
                      filterBy="#{value}"
                      style="#{style}">
                <f:facet name="header">
                    <h:outputText value="#{title}" />
                </f:facet>
                <h:outputText value="#{value}" />
            </p:column>
        </c:otherwise>
    </c:choose>
</ui:composition>

Eine JSF-Seite

Datei: irgendwas.xhtml
HTML:
...
<h:form>
            <mc:dataTable var="irgendwas" value="#{fooController.list}">
                <f:facet name="header">Der Titel</f:facet>
                <my:column value="#{irgentwas.irgendeinwert}" title="Ein Title"/>
...

Hoffe das hilft weiter. Wenn ja, dann danke klicken.

Grüße

Tatsu
 

beachhiker

Mitglied
In dem Zusammenhang stellt sich nun ein neues Problem. In der Komponenten dataTable übegebe ich einen ActionListner = onRowSelect. Über p:ajax event rufe ich diesen auf was nicht funktioniert. Schreibe ich den Actionlistener direkt in den aufruf p:ajax event funktioniert das event.

[XML]
<cc:interface>
<cc:attribute name="id" required="true"/>
<cc:attribute name="var" required="true"/>
<cc:attribute name="value" required="true"/>
<cc:attribute name="selectionMode" required="true"/>
<cc:attribute name="selection" required="true"/>
<cc:attribute name="onRowSelect" method-signature="java.lang.String f()"/>
</cc:interface>
<cc:implementation>
<p:dataTable id="#{cc.attrs.id}"
value="#{cc.attrs.value}"
selectionMode="#{cc.attrs.selectionMode}"
selection="#{cc.attrs.selection}" >

<c:set target="#{component}" property="var" value="#{cc.attrs.var}"/>

<!-- ********** funktioniert *********** -->
<p:ajax event="rowSelect" listener=#{kundeBeanHandler.onRowSelect}" update="someElement"/>

<!-- ********* funktioniert nicht ****************** -->
<p:ajax event="rowSelect" listener="#{cc.attrs.onRowSelect}" update="someElement" />


<cc:insertFacet name="header" />
<cc:insertChildren/>
</p:dataTable>
</cc:implementation>
[/XML]

Hat jemand eine Idee oder schon so ein ähnliches Thema?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JSF Composite components - dynamische dataTable? Web Tier 8
K jsf 1.2 tomahawk t:dataTable generic use Web Tier 3
W JSF DataTable - Filter Funktion funktioniert nicht Web Tier 3
W JSF einfache DataTable PrimeFaces Web Tier 1
F JSF h:dataTable fix Header und Scroll Body Web Tier 0
D JSF DataTable konvertiert Felder nicht Web Tier 1
K deleteButton in dataTable geht nur halb Web Tier 8
G JSP dataTable header - Datenwerte verwenden? Web Tier 3
T JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite Web Tier 11
F Primefaces Datatable => Inplaces Web Tier 3
F Primefaces Datatable Web Tier 6
F.S.WhiTeY JSF h:dataTable / p:komponente Pagination mit Buchstaben. Web Tier 2
jottyfan JSF dataTable und graphicImage (mit JQuery) Web Tier 4
M JSF DataTable refreshen mit Ajax? Web Tier 5
M JSF Datatable, nichts geht ohne vorher zu refreshen... Web Tier 4
P JSF 1.2 commandButton in dataTable Web Tier 2
L JSF Überflüssige Methodenaufrufe - dataTable Web Tier 5
J JSF Datatable bestimmte Methode Web Tier 4
T JSF/Richfaces rich:dataTable with rich:datascroller Web Tier 1
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
O Focus auf Textfeld, in letzter Reihe einer dataTable Web Tier 2
M Frage zur Konfiguration einer RichFaces DataTable Web Tier 4
M Datatable und der Zurückbutton Web Tier 4
K JSF Tomahawk dataScroller mit dataTable Web Tier 4
Y dataTable als dynamisches Grid Web Tier 4
E JSF Datatable erst nach Buttonklick anzeigen Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
V JSF: dataTable Getter wird nie aufgerufen Web Tier 6
S JSF dataTable Position feststellen Web Tier 2
S JSF: colspan und rowspan in datatable Web Tier 4
E JSF Datatable leere Zellen anzeigen Web Tier 2
T richfaces datatable Web Tier 3
A JSF: Datatable Links mit Properties Web Tier 3
S richfaces Datatable horizontal ausgeben Web Tier 2
L error-page mit ui:composite funktioniert nicht Web Tier 0
M JSF Composite Component Web Tier 8
A JSF ui:insert, ui:composite und ui:define; JSF 2.1 Web Tier 4
S Nested Composite Components Web Tier 2
R JSF JSF Composite Components: Problem mit Attributliste und Referenzierung Web Tier 2
T Spaltenüberschriften weg sobald Column als Composite Component Web Tier 4
L JSF Composit Component mit ajax funktioniert nicht. Web Tier 4
S JSF HandleRenderException: Cannot add the same component twice bei start von Tomcat7 Web Tier 4
M Tomahawk Unspupported component-family Web Tier 14
J JSF Custom Component ValueExpression wird nur als String erkannt Web Tier 2
G Tapestry Component Web Tier 2
G Undefined component type javax.faces.ViewRoot Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben