класса 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