javax.el.ELException: не удалось проанализировать выражение [{pz:instanceof(object,'com.project.domain.MyClass')}]

В настоящее время у меня есть веб-проект с JSF 1.2 и Facelets, работающий в tomcat 6.0.18.0. Я решил обновить контейнер сервлетов, поэтому я развернул его в tomcat 7, и все выглядело нормально, пока мы не наткнулись на одно представление, используя мои пользовательские функции Facelet.

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:
"}" ...
"." ...
"[" ...

Эта ошибка возникает при разборе следующего кода:

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

Если я правильно понимаю, выдает ошибку из-за двоеточия в выражении. Я отследил его до jasper-el, который поставляется в каталоге tomcat/lib, и если я заменю jasper.jar и jasper-el.jar на файлы из tomcat 6.0.18, все будет работать хорошо.

У кого-нибудь еще была эта проблема перед обновлением их кота? И как они это решили? Могу ли я развернуть в производстве tomcat 7 с этими jasper jar из tomcat 6, или это может вызвать дополнительные проблемы.


person Garytxo    schedule 23.10.2011    source источник


Ответы (4)


На самом деле это вводящее в заблуждение исключение. У него другая основная причина. Имя функции instanceof недопустимо.

В спецификации EL 2.2 говорится следующее:

1.14 Зарезервированные слова

Следующие слова зарезервированы для языка и не должны использоваться в качестве идентификаторов.

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

Обратите внимание, что многих из этих слов сейчас нет в языке, но они могут появиться в будущем, поэтому разработчики должны избегать их использования.

а также

1.19 Собранный синтаксис

...

Identifier ::= Java language identifier

...

Где идентификатор языка Java обозначает такие ключевые слова, как instanceof, if, while, class, return, static, new и т. д. Их нельзя использовать в качестве имен переменных/функций в EL. Если у вас есть свойства с такими именами, используйте скобки, например, #{bean['class'].simpleName} вместо #{bean.class.simpleName}.

Это было исправлено в Tomcat 7.0.4 или где-то ближе к этой версии, как указано в проблеме. 50147, где кто-то указал на ту же проблему, что и у вас. Итак, чтобы решить вашу проблему, вам нужно переименовать имя вашей функции EL, например, isInstanceOf или что-то в этом роде.

person BalusC    schedule 23.10.2011
comment
Это научит меня не называть функции зарезервированными словами, мелкое сообщение об ошибке не перечисляло их, и это могло бы избавить меня от головной боли. Еще раз спасибо BalusC. - person Garytxo; 24.10.2011

Добавьте эту строку в catalina.properties ([папка tomcat]/conf), и это должно решить проблему.

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true

Однако не следует использовать зарезервированные слова.

person Adrian Cosma    schedule 07.11.2012
comment
Спасибо, Адриан, я тоже так сделал. На самом деле, если я правильно помню, это было одно из первых изменений, которые я сделал, однако, если у вас все еще есть функция, напоминающая зарезервированное слово, например instanceof', она все равно выдаст ошибку. - person Garytxo; 12.11.2012

Вы также можете попробовать изменить синтаксис. У меня была точно такая же проблема с кодом, который я поддерживал, когда мы переходили с Tomcat 6 на 7. Мне пришлось изменить myobject.class.name на myobject['class'].name. После того, как я сделал это изменение, мой код снова работал отлично.

person user2970100    schedule 08.11.2013
comment
Чистое золото, этот ответ. Спасибо! Это также применимо при переходе с Jetty 7 на Tomcat 7. - person Paul D. Eden; 09.08.2014

Отличный намек, на самом деле! Мне пришлось изменить в моем jspx ${instance.class.simpleName == ...} на ${instance ['class'].simpleName eq ...}.

Я переходил с vFabric на tomcat 6 на vFabric на tomcat 7.

person scoutme    schedule 25.02.2014