You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by PÉNET LUDOVIC <l....@senat.fr> on 2012/11/01 10:31:26 UTC

Problem with tag component

Hi.

I have a problem with a tag component.
It behaves ok, excepted that I can not retrieve updated bean value in a
backend bean using evaluateExpressionGet or similar method. I always get
the original one.

My tag file looks like :

?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib id="sentest"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0"
>
    <namespace>http://www.senat.fr/taglib/sentest</namespace>

[...]
    <tag>
        <description>
            <![CDATA[
            À COMPLÉTER
            ]]>
        </description>
        <tag-name>senMandats</tag-name>
    <source>tags/sen/senMandats.xhtml</source>
        <attribute>
            <description>
                <![CDATA[
        Identifiant unique.
        ]]>
            </description>
            <name>id</name>
            <required>true</required>
            <type>java.lang.String</type>
        </attribute>
        <attribute>
            <description>
                <![CDATA[
     Contexte de sélection du Sénateur.
    ]]>
            </description>
            <name>context</name>
            <required>true</required>
        </attribute>
    </tag>
</facelet-taglib>

The component is defined using ui:composition. It looks like (nothing
special) :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html lang="fr"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:p="http://primefaces.org/ui"
    xmlns:sen="http://java.sun.com/jsf/composite/sen"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:sf="http://www.senat.fr/taglib/senfunctions"
    xmlns:st="http://www.senat.fr/taglib/sentest"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">
    <h:head/>
    <h:body>
        <ui:composition>
    [...]
        </ui:composition>
    </h:body>
</html>

I am passing dynamic el values to those custom components.

Example :

<st:senMandats id="toto" context="#{selectionContext}"/>

The selectionContext bean being defined elsewhere.

In st:senMandats, I use other custom components in a nested way. Something
like :

<st:listeMandats mandatContext="#{sensContext}"
asen="#{selectionContext.selectedSen}"/>

The listeMandat component uses a primefaces dataTable to display some
lists from the context. So, I have code like :

<h:outputLabel value="listeMandats de #{asen.libelleLong}"
styleClass="bigTitleMandats" rendered="#{not empty asen}" />
<p:dataTable id="tableMandatsSenatoriaux" value="#{mandatContext.asList}"
/* lots of other parameters */>

When I select an entry in the picker, the custom component gets properly
updated (an update is triggered by the picker). I can see that the
valueDisplayed by the h:outputLabel is correctly updated depending on the
selection.

When #{mandatContext.AsList} is called, I am retrieving #{asen} from the
application context and performing some internal update before returning
the requested list. There comes the problem : if #{asen} seems to be ok
when rendering #{asen.libelleLong}, I can not get the updated value from
the backing bean.

I am using the following function :

@SuppressWarnings("unchecked")
public static <T> T findBean(String name) {
    if ((name == null) || name.isEmpty())
        return null;
    FacesContext fc = FacesContext.getCurrentInstance();
    logger.debug("Retrieving #{" + name + "}");
    return (T) fc.getApplication().evaluateExpressionGet(fc,
            "#{" + name + "}", Object.class);
}

in the AsList method :

JSFUtils.findBean("asen")

It always return an old, not updated value.

What should I do so that my bean can access the updated value ? I tried
the solutions 4, 5 and 6 proposed by mykong in
http://www.mkyong.com/jsf2/access-a-managed-bean-from-event-listener-jsf/
but still does not get the right value.

Am I forced to code a custom component class, deriving from a specific
class ? If so, am I forced to also code a renderer ? I would like to avoid
that, as I appreciate to have the layout in an xhtml file.

Thanks in advance.

I am using :

PrimeFaces 3.4.1
CODI 1.0.5
OpenWebBeans 1.1.6
MyFaces 2.1.9
Tomcat 7.0.32

I asked this question on stackoverflow :
http://stackoverflow.com/questions/13163033/getting-dynamic-parameters-of-a-jsf-2-custom-component-from-a-backing-bean

@BalusC suspected "a bug in the JSF impl used as to referencing EL
expressions in tag file attributes" and I will try with Mojarra on monday
(bank holiday here in France).

What is your opinion ?

Thanks in advance,

Ludovic

|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|