Search code examples
jsfelinstanceof

instanceof check in EL expression language


Is there a way to perform an instanceof check in EL?

E.g.

<h:link rendered="#{model instanceof ClassA}">      
    #{errorMessage1}
</h:link>
<h:link rendered="#{model instanceof ClassB}">      
    #{errorMessage2}
</h:link>

Solution

  • You could compare Class#getName() or, maybe better, Class#getSimpleName() to a String.

    <h:link rendered="#{model['class'].simpleName eq 'ClassA'}">      
        #{errorMessage1}
    </h:link>
    <h:link rendered="#{model['class'].simpleName eq 'ClassB'}">      
        #{errorMessage2}
    </h:link>
    

    Note the importance of specifying Object#getClass() with brace notation ['class'] because class is a reserved Java literal which would otherwise throw an EL exception in EL 2.2+.

    The type safe alternative is to add some public enum Type { A, B } along with public abstract Type getType() to the common base class of the model.

    <h:link rendered="#{model.type eq 'A'}">      
        #{errorMessage1}
    </h:link>
    <h:link rendered="#{model.type eq 'B'}">      
        #{errorMessage2}
    </h:link>
    

    Any invalid values would here throw an EL exception during runtime in EL 2.2+.

    In case you're using OmniFaces, since version 3.0 you could use #{of:isInstance()}.

    <h:link rendered="#{of:isInstance('com.example.ClassA', model)}">      
        #{errorMessage1}
    </h:link>
    <h:link rendered="#{of:isInstance('com.example.ClassB', model)}">      
        #{errorMessage2}
    </h:link>