Voor mijn huidige project hebben we met JSF een aantal templates en custom components gemaakt. Een aantal maanden werkte het prima, maar nu lopen we tegen een probleem aan, namelijk omdat we een converter willen registreren die niet goed werkt.
Ik zal het even proberen te schetsen.
We hebben een component, namelijk een column voor in een dataTable. Die is ervoor om zaken als CSS en sorteren wat generieker te maken. Zie code:
Die column wordt als volgt gebruikt in een client pagina:
Wat is nu het probleem? Die datumConverter werkt niet wanneer deze zich in een custom component bevindt (o:column). De converter krijgt namelijk een object van het type String binnen in plaats van een Datum. Wanneer ik een h:column gebruik, dan werkt het prima.
Ik denk dat ik de reden ook wel weet, namelijk dat een EL expressie naar een String evalueert omdat het alleen gebruikt wordt voor weergave.
Ik geef dit mee aan de component:
<o:column label="..." value="#{current.datumProperty}">
<o:datumConverter pattern="dd-MM-yyyy HH:mm:ss" />
</o:column>
Maar wat gebeurt er?
De expressie wordt uitgevoerd, retourneert een string, dat wordt in het component gestopt en de converter krakt omdat hij eigenlijk een Date verwacht.
Weet iemand hoe je kunt zorgen dat de expressie niet direct uitgevoerd wordt?
Ik zal het even proberen te schetsen.
We hebben een component, namelijk een column voor in een dataTable. Die is ervoor om zaken als CSS en sorteren wat generieker te maken. Zie code:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <html ...> <ui:composition> <h:column id="#{id}"> <f:facet name="header"> Vanalles voor de header... </f:facet> <h:outputText value="#{value}" id="value_#{id}_text"> <ui:insert /> </h:outputText> </h:column> </ui:composition> </html> |
Die column wordt als volgt gebruikt in een client pagina:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html ...> <ui:composition> ... <h:form> #{i18n.Statushistorie} <h:dataTable value="#{bean.property}" var="current" ...> <o:column label="..." value="#{current.datumProperty}"> <o:datumConverter pattern="dd-MM-yyyy HH:mm:ss" /> </o:column> <h:column label="..." > <h:outputText value="#{current.prop}"> <o:datumConverter pattern="dd-MM-yyyy HH:mm:ss" /> </h:outputText> </h:column> </h:dataTable> </h:form> </ui:composition> </html> |
Wat is nu het probleem? Die datumConverter werkt niet wanneer deze zich in een custom component bevindt (o:column). De converter krijgt namelijk een object van het type String binnen in plaats van een Datum. Wanneer ik een h:column gebruik, dan werkt het prima.
Ik denk dat ik de reden ook wel weet, namelijk dat een EL expressie naar een String evalueert omdat het alleen gebruikt wordt voor weergave.
Ik geef dit mee aan de component:
<o:column label="..." value="#{current.datumProperty}">
<o:datumConverter pattern="dd-MM-yyyy HH:mm:ss" />
</o:column>
Maar wat gebeurt er?
De expressie wordt uitgevoerd, retourneert een string, dat wordt in het component gestopt en de converter krakt omdat hij eigenlijk een Date verwacht.
Weet iemand hoe je kunt zorgen dat de expressie niet direct uitgevoerd wordt?
Fat Pizza's pizza, they are big and they are cheezy