java - 获取 IllegalStateException : No such servlet: jsp when accessing deployed java application to Google App Engine

标签 java eclipse jsp google-app-engine servlets

我在使用应用引擎时遇到了此类问题 ( this one )。

我刚刚开始尝试使用 Eclipse 插件将我的 Java 应用程序部署到 App Engine,在本地主机(使用 Tomcat 服务器和 App Engine 标准本地主机)测试了至少 100 次之后,它在本地运行良好。

但是当我将其部署为应用程序引擎标准时,当我尝试访问任何 servlet 时出现此错误:

java.lang.IllegalStateException: No such servlet: jsp at org.eclipse.jetty.servlet.ServletHandler.updateMappings (ServletHandler.java:1535) at org.eclipse.jetty.servlet.ServletHandler.doStart (ServletHandler.java:157) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.security.SecurityHandler.doStart (SecurityHandler.java:361) at org.eclipse.jetty.security.ConstraintSecurityHandler.doStart (ConstraintSecurityHandler.java:448) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.server.handler.ScopedHandler.doStart (ScopedHandler.java:120) at org.eclipse.jetty.server.session.SessionHandler.doStart (SessionHandler.java:116) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.server.handler.ScopedHandler.doStart (ScopedHandler.java:120) at org.eclipse.jetty.server.handler.ContextHandler.startContext (ContextHandler.java:809) at org.eclipse.jetty.servlet.ServletContextHandler.startContext (ServletContextHandler.java:345) at org.eclipse.jetty.webapp.WebAppContext.startWebapp (WebAppContext.java:1406) at org.eclipse.jetty.webapp.WebAppContext.startContext (WebAppContext.java:1368) at org.eclipse.jetty.server.handler.ContextHandler.doStart (ContextHandler.java:778) at org.eclipse.jetty.servlet.ServletContextHandler.doStart (ServletContextHandler.java:262) at org.eclipse.jetty.webapp.WebAppContext.doStart (WebAppContext.java:522) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.createHandler (AppVersionHandlerMap.java:244) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler (AppVersionHandlerMap.java:182) at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest (JettyServletEngineAdapter.java:97) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest (JavaRuntime.java:680) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest (JavaRuntime.java:642) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run (JavaRuntime.java:612) at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run (JavaRuntime.java:806) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run (ThreadGroupPool.java:274) at java.lang.Thread.run (Thread.java:745)

我可以访问其他文件、图像、*.html。

我不知道它是否重要,我注意到在应用程序引擎中,我的 web.xml 文件通过添加 servletservelt-mapping (映射到云)进行了修改我认为)用于我的所有 *.jsp 文件,但不在本地主机中。

日志详细信息中的某处“此请求导致您的应用程序启动一个新进程,从而导致您的应用程序代码首次加载。因此,与典型的请求相比,此请求可能需要更长的时间并使用更多的 CPU请求您的申请。”,我不知道它是否链接到我的试用帐户。

我正在使用 datanucleus (datanucleus-api-jdo-5.1.0-release) 库,我的 web.xml 中也有一些过滤器、索引文件和错误页面 jsp。

Eclipse 项目方面:
App Engine标准环境:JRE8
Servlet API:2.5
JAVA:1.8
JPA:1.0

我真的需要帮助,谢谢。

appengine-web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">

  <threadsafe>true</threadsafe>
  <sessions-enabled>true</sessions-enabled>

  <runtime>java8</runtime>
</appengine-web-app>

web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>my_project</display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- SERVLETS  DEFs -->
  
  <servlet>
    <servlet-name>Welcome</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Welcome</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Statistic</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Statistic</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Genea_Tree</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Genea_Tree</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Genea_TreeEdit</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Genea_TreeEdit</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>New_event</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.New_event</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Inscription</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Inscription</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>InscriptionStep1</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.InscriptionStep1</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>InscriptionStep2</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.InscriptionStep2</servlet-class>
  </servlet>
  <servlet>
   <servlet-name>InscriptionConfirm</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.InscriptionConfirm</servlet-class>
  </servlet>
  <servlet>
   <servlet-name>About</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.About</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>AdminDashboard</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.AdminDashboard</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>AdminAuthentification</servlet-name>
    <servlet-class>my_root_package.servlets.secutity.controllers.AdminAuthentification</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>AdminPassReset</servlet-name>
    <servlet-class>my_root_package.servlets.secutity.controllers.AdminPassReset</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Search</servlet-name>
    <servlet-class>my_root_package.servlets.controllers.Search</servlet-class>
  </servlet>
  
<!-- SERVLETS  MAPPING -->

  <servlet-mapping>
    <servlet-name>Welcome</servlet-name>
    <url-pattern>/welcome</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Statistic</servlet-name>
    <url-pattern>/statistic</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Genea_Tree</servlet-name>
    <url-pattern>/genea_tree</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Genea_TreeEdit</servlet-name>
    <url-pattern>/genea_tree/DetailEdit</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Genea_TreeEdit</servlet-name>
    <url-pattern>/genea_tree/DetailEditMore</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>New_event</servlet-name>
    <url-pattern>/new_event</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Inscription</servlet-name>
    <url-pattern>/inscription</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>InscriptionStep1</servlet-name>
    <url-pattern>/inscription/step1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>InscriptionStep2</servlet-name>
    <url-pattern>/inscription/step2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>InscriptionConfirm</servlet-name>
    <url-pattern>/inscription/Confirmation</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>About</servlet-name>
    <url-pattern>/about</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminAuthentification</servlet-name>
    <url-pattern>/admin/Authentification</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminPassReset</servlet-name>
    <url-pattern>/admin/PassReset</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/dashboard</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/dashboard/insertionCommit</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/dashboard/updateCommit</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/dashboard/deleteCommit</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/InsertionCommitPost</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/updateCommitPost</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AdminDashboard</servlet-name>
    <url-pattern>/admin/deleteCommitPost</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Search</servlet-name>
    <url-pattern>/AdvancedSearch</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Search</servlet-name>
    <url-pattern>/search</url-pattern>
  </servlet-mapping>

	<!-- ERROR PAGES -->

	<error-page>
		<exception-type>java.lang.Exception</exception-type>
		<location>/WEB-INF/errorManagement.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/WEB-INF/404ErrorManagement.jsp</location>
	</error-page>

	<jsp-config>
		<jsp-property-group>
			<url-pattern>*.jsp</url-pattern>
			<page-encoding>UTF-8</page-encoding>
			<include-prelude>/WEB-INF/taglibs.jsp</include-prelude>
		</jsp-property-group>
	</jsp-config>
	
	
	<filter>
		<filter-name>encodingfilter</filter-name>
		<filter-class>my_root_package.filters.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

<!-- 	FILTERS DEFs -->
	<filter>
		<filter-name>multipartFilter</filter-name>
		<filter-class>my_root_package.filters.MultipartFilter</filter-class>
		<init-param>
			<param-name>maxFileSize</param-name>
			<param-value>360000</param-value>
		</init-param>
	</filter>

	<!-- 	FILTERS MAPPING -->
	<filter-mapping>
		<filter-name>encodingfilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter-mapping>
		<filter-name>multipartFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
</web-app>

最佳答案

抱歉,我没有看到您的更新。我注意到你的 web.xml 中有一个 jsp-config引用 *.jsp 的部分URL 模式,但您的 servlet 映射都没有 jsp后缀。

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
        <include-prelude>/WEB-INF/taglibs.jsp</include-prelude>
    </jsp-property-group>
</jsp-config>

GAE 预编译 JSP 作为部署过程的一部分,因此我不确定这种类型的处理是否有效。您可以尝试内联对 taglibs.jsp 的引用吗?而是在您的 JSP 中?您应该能够执行以下操作:

<%@ include file="/WEB-INF/taglibs.jsp" %> 

更新:我遇到了 a post一位 Google 工程师宣布 <jsp-config>像你这样的选项应该有效。如果包含有效,那么最好 open a bug on the issue tracker .

关于java - 获取 IllegalStateException : No such servlet: jsp when accessing deployed java application to Google App Engine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002444/

相关文章:

java - 忽略 EclEmma 中单元测试的代码覆盖率

java - 如何使用表达式在 JSP 中检索新生成的图像

java - jsp中的UTF-8编码

java - 什么是 JSP 上下文?

java - 将嵌入式插件 jar 文件添加到项目中

java - 在 list 中指定 -javaagent 选项

java - 如何在eclipse中添加jasypt插件

linux - 为什么 Eclipse 颜色与 XFCE 如此困惑?

java - 无法单击链接以摆脱游览弹出窗口

encryption - 如何通过 java 的加密扩展加密 PGP 消息?