Org.apache.jasper.el.ELContextImpl не может быть передан в org.apache.jasper.runtime.ELContextImpl

У меня есть проект веб-сервиса, реализованный в java, и он также содержит страницы jsp. Я развертываю его на причале 8.1.5 на своей машине, и он работает нормально. Но когда я развертываю на сервере Windows 2003 с пристройкой 8.1.3, это дает это исключение:

org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl

Это полная трассировка:

java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl
    at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1002)
    at org.apache.jsp.home.index_jsp._jspService(org.apache.jsp.home.index_jsp:52)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:542)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:271)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
    at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:557)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:499)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
    at org.eclipse.jetty.server.Server.handle(Server.java:350)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
    at java.lang.Thread.run(Unknown Source)

Любая идея, каково это исключение и как его исправить?

Ответ 1

Это может произойти, если ваш webapp отправляет с JAR файлами, специфичными для сервлетов, такими как jasper.jar, jetty.jar servlet.jar и т.д. в /WEB-INF/lib по какой-то неясной причине. Это, в свою очередь, конфликтует с другим версированным файлом JAR на целевом контейнере-сервлете.

Удалите этот JAR файл, специфичный для servletcontainer, из вашего webapp /WEB-INF/lib. Это не принадлежит. Предполагается, что он уже поставляется самим сервлетом-контейнером.

См. также:

  • Как импортировать API javax.servlet в проект Eclipse? (это точно не отвечает на вашу конкретную проблему, но это, по крайней мере, технически то же самое которая должна дать вам лучшее понимание этой общей ошибки стартера)

Ответ 2

IF вы используете maven (я просил комментарий без ответа), вы можете избежать конфликтных банок, используя "предоставленную" область. Когда вы развертываете его для производства, банки не включаются.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

Я не уверен в флягах, но это, вероятно, то же самое.

IF, вы НЕ, используя maven, вы должны перенести свои конфликтующие банки (сервлеты и причалы) в свою папку с расширением контейнера и удалить их из своих приложений. WEB-INF/lib.

Ответ 3

Если папка /WEB -INF/lib вашего веб-приложения не содержит jasper.jar(см. ответ BalusC), проверьте, работает ли в вашем контейнере другой webapp. Затем проверьте, содержит ли этот webapp файл jasper.jar в своей папке /WEB -INF/lib. Это случилось с нами. Удалите jasper.jar из этих webapps (sic!), Проблема может быть решена. Очевидно, что webapps не являются изолированными для других, как они должны быть. Проблема возникла, когда мы переключились с Tomcat6 на Tomcat7, а jasper.jar(версия 6) случайно был связан с одним из наших веб-приложений.

Ответ 4

Помимо упомянутых ответов, обратите внимание на еще одну вещь. У меня есть другая война, развернутая под тем же экземпляром Tomcat 7.0.42, который имел jsp-2.1-6.0.2.jar под своим WEB-INF/lib. Эта банка имеет класс org.apache.jasper.runtime.ELContextImpl.

Мое понимание заключалось в том, что каждый webapp имеет свой собственный загрузчик классов, а файлы классов, загруженные одним webapp, не видны другому webapp. Но пока ничего не работало, я удалил другую войну, в которой был jsp.jar, и перезапустил мой кот, и, к моему удивлению, исключение больше не было. Как-то этот класс загружался и вызывал проблему.

Интересно, что обе эти войны прекрасно работают в Tomcat 6.x.

Ответ 5

Я столкнулся с той же проблемой и попробовал все предложения, ни одна из них не работала для меня. Я, наконец, узнал, что проблема возникла после использования Spring Boot, переопределяющего мою версию tomcat, поскольку у меня был

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.0.M2</version>

Удаление Spring Boot решает проблему. Этот ответ может предоставить решение для использования Spring Boot + Maven + Tomcat 8.

Ответ 6

Для меня (Jetty 8.1.14) это точное сообщение об ошибке было вызвано другим webapp в том же контейнере Jetty. Вы используете несколько веб-приложений?

Ответ 7

Добавьте эту строку в <context>:

<Loader delegate="true" />

Эта проблема связана с конфликтующими банками в теге application. Это выглядит так:

<?xml version='1.0' encoding='utf-8'?>
<!-- The contents of this file will be loaded for each web application -->
<Context>

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <Loader delegate="true" /> <!--this line-->
  <!-- Uncomment this to disable session persistence across Tomcat restarts -->
  <!--
      <Manager pathname="" />
    -->

  <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) -->
  <!--
      <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>

Ответ 8

Проблема, связанная с решением проблем, в том числе с LifeRay 6.2 CE, в том числе:

En el archivo de configuración.