繁体   English   中英

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(request,response)将一个Web应用程序(使用Jersey 2.10)的请求转发到另一个(“ myWebapp ”)。 这两个Web应用程序都位于/ 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$1 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 2.17。 这可能是泽西岛的事情,与实际转发无关,我该如何解决...?

更新:有趣的是,无论请求方法是GET还是POST,都将引发相同的错误。 在另一个应用程序中,使用完全相同的设置,转发有效。 因此,我认为,这本身不是泽西岛问题,而是取决于我的设置。 仍然不知道可能是什么。

为了保持一致,我在转发以及最终请求的Webapp中将Jersey版本更改为2.5.1。 做到了,实际上很简单。 太糟糕了,我没有意识到这一点,因为以前我遇到过不同球衣版本的问题。

编辑:事实证明,此约束实际上非常累人,并且在需要更改Jersey的必要版本上使其变得乏味,以保持所有应用程序的一致性。 在更新到2.22.2时,即使使用相同的版本,也确实发生了错误。 现在更好的解决方案是将调度程序webapp更改为简单的servlet,因此它不包含任何Jersey依赖项,因此不会与转发的应用程序的Jersey版本冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM