javax.el.ELException: не удалось проанализировать выражение [{pz: instanceof (object, 'com.project.domain.MyClass')}] - PullRequest
7 голосов
/ 23 октября 2011

В настоящее время у меня есть веб-проект с 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, или это может вызвать дальнейшие проблемы.

Ответы [ 4 ]

17 голосов
/ 23 октября 2011

Это на самом деле вводящее в заблуждение исключение.У этого есть другая основная причина.Имя функции 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 или что-то еще.

8 голосов
/ 07 ноября 2012

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

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true

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

5 голосов
/ 08 ноября 2013

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

2 голосов
/ 25 февраля 2014

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

Я перешел из vFabric на tomcat6 к vFabric на tomcat 7

...