You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Jakob Korherr (JIRA)" <de...@myfaces.apache.org> on 2010/02/12 16:38:27 UTC

[jira] Commented: (MYFACES-2552) TagValueExpression.getType() returns null if the property in the managed bean is null and the expression points to a facelets composite component attribute

    [ https://issues.apache.org/jira/browse/MYFACES-2552?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12833029#action_12833029 ] 

Jakob Korherr commented on MYFACES-2552:
----------------------------------------

I just found out why this happens: #{cc.attrs} resolves to a Map (CompositeComponentAttributesMapWrapper) and thus javax.el.MapELResolver is used to resolve the values. Here is the important part of the implementation of the getType() method from Tomcat:

if (base instanceof Map<?,?>) {
    context.setPropertyResolved(true);
    Object obj = ((Map<?,?>) base).get(property);
    return (obj != null) ? obj.getClass() : null;
}

This explains the behavior. So we can only circumvent this by not using a Map, however I don't know if we should really change this...

> TagValueExpression.getType() returns null if the property in the managed bean is null and the expression points to a facelets composite component attribute
> -----------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-2552
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2552
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.0.0-beta-2
>            Reporter: Jakob Korherr
>            Assignee: Jakob Korherr
>
> if you have a facelets composite component with an attribute "test" that points to a property in a managed bean (e.g. #{myBean.property}) which is currently null and you refer to that attribute in the implementation via #{cc.attrs.test} you can get the current value (null) or set a new value but you cannot get the type of the property (e.g. String[]). However if the property in the managed bean is non-null you can get the type.
> For example:
> <cc:interface name="mycomponent">
>     <cc:attribute name="test" required="true"/>
> </cc:interface>
> <cc:implementation>
>     <h:selectManyListbox value="#{cc.attrs.test}">
>         <f:selectItems value="#{some select items}"/>
>     </h:selectManyListbox>
> </cc:implementation>
> --> calling #{cc.attrs.test}.getType() will fail if #{cc.attrs.test} resolves to null, but will work if #{cc.attrs.test} resolves to some valid value.
> This currently results in a NullPointerException in _SharedRendererUtils.getConvertedUISelectManyValue().

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.