javax.el.ELException: Failed to parse the expression [{pz:instanceof(object,'com.project.domain.MyClass')}]
Asked Answered
A

4

7

Currenty I have a web project with JSF 1.2 and Facelets running in tomcat 6.0.18.0. I decided to upgrade the servlet container, thus i deployed in tomcat 7 and all seemed ok until we hit one view using my custome facelet functions.

javax.el.ELException: Failed to parse the expression [{pz:instanceof(object,'com.project.domain.MyClass')}]

Caused by: org.apache.el.parser.ParseException: Encountered " ":" ": "" at line 1, column 5. Was expecting one of:
"}" ...
"." ...
"[" ...

This error occurs when parsing the following code:

<ui:repeat var="object" value="#{objects}">
<ui:fragment rendered="#{pz:instanceof(object,'com.project.domain.MyClass')}">
...

If i understand correctly it throws an error because of the colon in the expression . I have tracked it down to the jasper-el that come with in the tomcat/lib directory, and if I replace jasper.jar and jasper-el.jar with the ones from tomcat 6.0.18 everythign works well.

Has anyone else had this problem before upgrading their tomcat? And How did they resolve it? Could I deploy in production tomcat 7 with these jasper jar from tomcat 6, or could this cause further problems.

Amedeo answered 23/10, 2011 at 14:39 Comment(0)
I
17

This is actually a misleading exception. It has a different underlying cause. The function name instanceof is invalid.

The EL 2.2 specification says the following:

1.14 Reserved Words

The following words are reserved for the language and must not be used as identifiers.

    and   eq     gt     true   instanceof
    or    ne     le     false  empty
    not   lt     ge     null   div        mod

Note that many of these words are not in the language now, but they may be in the future, so developers must avoid using these words.

and

1.19 Collected Syntax

...

Identifier ::= Java language identifier

...

Where the Java language identifier stands for keywords like instanceof, if, while, class, return, static, new, etc. They may not be used as variable/function names in EL. In case you have properties with those names, use the brace notation instead like so #{bean['class'].simpleName} instead of #{bean.class.simpleName}.

This was been fixed in Tomcat 7.0.4 or somewhere near before this version as indicated by issue 50147 wherein someone else pointed out the same problem as you have. So, to solve your problem, you have to rename your EL function name to for example isInstanceOf or something.

Ineslta answered 23/10, 2011 at 15:56 Comment(1)
That will teach me not to name functions with reserved words, petty the error message did not list those aswell it could have saved me a lot of headache. Thanks again BalusC.Amedeo
K
8

Add this line in catalina.properties ([tomcat folder]/conf), and it should fix the issue.

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true

However, you should not use the reserved words.

Kinny answered 7/11, 2012 at 13:26 Comment(1)
Thanks Adrian, i did this too. In fact if I remeber correctly, this was one of the first changes I made, however if you still have a function that resembles a reserved word, such as "instanceof' it will still throw an error.Amedeo
L
6

You can also try changing the syntax. I had the same exact problem with code that I was maintaining when we were moving from Tomcat 6 to 7. I had to change myobject.class.name to myobject['class'].name. After I made this change my code worked perfectly again.

Lemma answered 8/11, 2013 at 18:40 Comment(1)
Pure gold, that response. Thank you! It was also applicable moving from Jetty 7 to Tomcat 7.Offcolor
C
2

Great hint, indeed! I had to change in my jspx ${instance.class.simpleName == ...} with ${instance['class'].simpleName eq ...}.

I was moving from vFabric on tomcat 6 to vFabric on tomcat 7

Climacteric answered 25/2, 2014 at 1:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.