instanceof check in EL expression language

el, instanceof, jsf

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>

Problem

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> ```

Original source

Related problems