tomcat 中的跨上下文请求转发导致 java.lang.ClassCastException:org.glassfish.jersey.message.internal.TracingLogger
Cross-context request forwarding in tomcat results in java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger
我正在尝试使用 RequestDispatcher.forward(请求,响应)将请求从一个 Web 应用程序(使用 Jersey 2.10)转发到另一个 Web 应用程序(“myWebapp
”)。两个网络应用程序都位于 /tomcat/webapps。在 context.xml 我设置 <Context crossContext="true">
.
@GET
@Path("")
public Response getTest(
@Context ServletContext context,
@Context HttpServletRequest request,
@Context HttpServletResponse response)
throws Exception {
ServletContext fCtx = context.getContext("/myWebapp");
System.out.println("ctx: "+context);
System.out.println("forward-ctx: "+fCtx);
RequestDispatcher dispatcher=fCtx.getRequestDispatcher("/test");
System.out.println("rd: "+dispatcher);
System.out.println("request: "+request);
System.out.println("response: "+response);
dispatcher.forward(request, response); <- throwing ClassCastException
}
这显示了以下输出:
ctx: org.apache.catalina.core.ApplicationContextFacade@48a7c880
forward-ctx: org.apache.catalina.core.ApplicationContextFacade@72d0abcb
rd: org.apache.catalina.core.ApplicationDispatcher@7f5c70c3
request: org.apache.catalina.connector.RequestFacade@3829f752
response: org.apache.catalina.connector.ResponseFacade@4b2c454c
所以一切都应该设置好了。但是当我执行它时,我在转发时遇到以下异常:
java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger cannot be cast to org.glassfish.jersey.message.internal.TracingLogger
at org.glassfish.jersey.message.internal.TracingLogger.getInstance(TracingLogger.java:144)
at org.glassfish.jersey.server.internal.routing.UriRoutingContext.<init>(UriRoutingContext.java:115)
at org.glassfish.jersey.server.ContainerRequest.<init>(ContainerRequest.java:179)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:345)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:690)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:477)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
我不确定,这是否与 Jersey 不兼容?我尝试了最新版本的 Jersey 2.17。这可能是 Jersey 的事情,与实际转发无关,我该如何解决...?
更新:
有趣的是,不管请求方法是GET还是POST,都会抛出同样的错误。在另一个应用程序中,使用完全相同的设置,转发有效。所以我认为,这本身不是 Jersey 问题,而是取决于我的设置。仍然无法弄清楚它可能是什么。
在转发以及最终请求的 webapp 中将我的 Jersey 版本更改为 2.5.1,以保持一致。成功了,其实很简单。太糟糕了,我没有意识到这一点,因为我之前遇到过不同球衣版本的问题。
编辑: 事实证明,这个约束实际上非常累人,并且使 Jersey 的必要版本更改变得乏味,以保持所有应用程序的一致性。在更新到 2.22.2 时,即使是相同的版本也会发生错误。现在更好的解决方案是,将调度程序 webapp 更改为一个简单的 servlet,因此它不包含任何 Jersey 依赖项,因此不会与转发应用程序的 Jersey 版本冲突。
我正在尝试使用 RequestDispatcher.forward(请求,响应)将请求从一个 Web 应用程序(使用 Jersey 2.10)转发到另一个 Web 应用程序(“myWebapp
”)。两个网络应用程序都位于 /tomcat/webapps。在 context.xml 我设置 <Context crossContext="true">
.
@GET
@Path("")
public Response getTest(
@Context ServletContext context,
@Context HttpServletRequest request,
@Context HttpServletResponse response)
throws Exception {
ServletContext fCtx = context.getContext("/myWebapp");
System.out.println("ctx: "+context);
System.out.println("forward-ctx: "+fCtx);
RequestDispatcher dispatcher=fCtx.getRequestDispatcher("/test");
System.out.println("rd: "+dispatcher);
System.out.println("request: "+request);
System.out.println("response: "+response);
dispatcher.forward(request, response); <- throwing ClassCastException
}
这显示了以下输出:
ctx: org.apache.catalina.core.ApplicationContextFacade@48a7c880
forward-ctx: org.apache.catalina.core.ApplicationContextFacade@72d0abcb
rd: org.apache.catalina.core.ApplicationDispatcher@7f5c70c3
request: org.apache.catalina.connector.RequestFacade@3829f752
response: org.apache.catalina.connector.ResponseFacade@4b2c454c
所以一切都应该设置好了。但是当我执行它时,我在转发时遇到以下异常:
java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger cannot be cast to org.glassfish.jersey.message.internal.TracingLogger
at org.glassfish.jersey.message.internal.TracingLogger.getInstance(TracingLogger.java:144)
at org.glassfish.jersey.server.internal.routing.UriRoutingContext.<init>(UriRoutingContext.java:115)
at org.glassfish.jersey.server.ContainerRequest.<init>(ContainerRequest.java:179)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:345)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:690)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:477)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
我不确定,这是否与 Jersey 不兼容?我尝试了最新版本的 Jersey 2.17。这可能是 Jersey 的事情,与实际转发无关,我该如何解决...?
更新: 有趣的是,不管请求方法是GET还是POST,都会抛出同样的错误。在另一个应用程序中,使用完全相同的设置,转发有效。所以我认为,这本身不是 Jersey 问题,而是取决于我的设置。仍然无法弄清楚它可能是什么。
在转发以及最终请求的 webapp 中将我的 Jersey 版本更改为 2.5.1,以保持一致。成功了,其实很简单。太糟糕了,我没有意识到这一点,因为我之前遇到过不同球衣版本的问题。
编辑: 事实证明,这个约束实际上非常累人,并且使 Jersey 的必要版本更改变得乏味,以保持所有应用程序的一致性。在更新到 2.22.2 时,即使是相同的版本也会发生错误。现在更好的解决方案是,将调度程序 webapp 更改为一个简单的 servlet,因此它不包含任何 Jersey 依赖项,因此不会与转发应用程序的 Jersey 版本冲突。