我遇到了问题而且我不知道如何解决它。
我的Web应用程序MyApp
是一个Maven Web应用程序项目(Java 8和Java EE 5)。要在同一服务器上将更新版本作为测试实例运行,我将应用程序的上下文路径从MyApp
更改为MyAppTest
。作为servlet容器,我使用的是Tomcat 8。
MyApp
实例按预期工作。但是,MyAppTest
实例在将请求转发给我的一个servlet时抛出异常。即使MyApp
和MyAppTest
除上下文路径外相同,也会发生此异常。 Servlet通过Guice的ServletModule进行映射。
消息:
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-4
堆栈跟踪:
java.lang.String.substring(未知来源) com.google.inject.servlet.ServletDefinition $ 2.getPathInfo(ServletDefinition.java:212) org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:376) org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) myapp.base.MainEntryServlet.service(MainEntryServlet.java:49) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:286) com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:276) com.google.inject.servlet.ManagedServletPipeline $ 1.doServiceImpl(ManagedServletPipeline.java:154) com.google.inject.servlet.ManagedServletPipeline $ 1.forward(ManagedServletPipeline.java:140) myapp.auth.LogoutServlet.service(LogoutServlet.java:57) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:286) com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:276) com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:181) com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85) com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120) com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:135) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:873) org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:670) org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1520) org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1476) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(未知来源)
转发请求的Servlet执行此操作:
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
if (!response.isCommitted()) {
dispatcher.forward(request, response);
}
URL index.jsp
映射到另一个Servlet。它将请求转发给JSP:
request.getRequestDispatcher("/theme/index.jsp").forward(request, response);
发生异常。其他一些JSP包含在index.jsp
中,如下所示:
<jsp:include flush="true" page="menu.jsp"/>
menu.jsp
与index.jsp
位于同一文件夹中。
如前所述,只要上下文路径为MyApp
,一切正常。当更改为MyAppTest
时,会发生异常。它必须与Context路径本身有关。将路径更改为MyAppTest
时,异常消息为&#34;字符串索引超出范围:-4&#34;。当我将路径更改为MyAppTesting
时,异常消息将更改为&#34;字符串索引超出范围:-7&#34;。
为了解决这个问题,我尝试了以下方法:
MyAppTest
中的context.xml
。MyAppTest
。MyAppTest
。没有任何效果。而且我不知道是什么导致了这个例子:Maven,Tomcat或Guice。