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

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

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 с теми из tomcat 6.0.18 everythign работает хорошо.

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

4 ответов


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

на Эль 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, etc. Они не могут использоваться в качестве имен переменных/функций в EL. Если у вас есть свойства с этими именами, используйте обозначение скобки вместо этого #{bean['class'].simpleName} вместо #{bean.class.simpleName}.

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


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

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true

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


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


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

я переходил из vFabric на tomcat 6 в vFabric на tomcat 7