【问题标题】:inject context HttpServletRequest cause "interface org.glassfish.hk2.api.ProxyCtl is not visible from class loader" (jersey 2.21, weblogic 12.1.3)注入上下文 HttpServletRequest 导致“接口 org.glassfish.hk2.api.ProxyCtl 在类加载器中不可见”(球衣 2.21,weblogic 12.1.3)
【发布时间】:2015-08-27 15:50:26
【问题描述】:

我在 weblogic 12c (12.1.3) 上使用 jersey 2.21 来提供 Rest。 Rest 类在不注入上下文 HTTPServeletRequest/HTTPServletResponse 的情况下工作正常。但是一旦注入上下文,它会在调用服务时抛出“interface org.glassfish.hk2.api.ProxyCtl is not visible from class loader”错误。

这是课程:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Path("test")
public class TestResource {
Logger logger = LoggerFactory.getLogger(TestResource.class);


@Context HttpServletResponse resp; 
@Context HttpServletRequest request; 


/**
 * Test site connectivity. Return parameter txt's content in reply
 * @param content
 * @return 
 */
@GET
@Path("/tryMe")
@Produces(MediaType.TEXT_PLAIN)
public String echoTest(@QueryParam("txt") String content) { 
    System.out.println("Try me reach.");
    System.out.println("from client: "+request.getRemoteAddr()); 


    return content;
}

}

如果注释掉这两个上下文,调用 tryMe Restful 时不会出错。
当使用这两个上下文时,调用 tryMe restful,会抛出以下错误:

Root cause of ServletException.
        A MultiException has 2 exceptions.  They are:
        1. java.lang.IllegalArgumentException: interface org.glassfish.hk2.api.ProxyCtl is not visible from class loader
        2. java.lang.IllegalArgumentException: While attempting to create a Proxy for javax.servlet.http.HttpServletRequest in scope org.glassfish.jersey.process.internal.RequestScoped an error occured while creating the proxy

            at org.jvnet.hk2.internal.ProxyUtilities.generateProxy(ProxyUtilities.java:225)
            at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2044)
            at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
            at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
            at org.glassfish.jersey.internal.inject.ContextInjectionResolver.resolve(ContextInjectionResolver.java:126)
            Truncated. see log file for complete stacktrace
        Caused By: java.lang.IllegalArgumentException: interface org.glassfish.hk2.api.ProxyCtl is not visible from class loader
            at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:581)
            at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557)
            at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230)
            at java.lang.reflect.WeakCache.get(WeakCache.java:127)
            at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)
            Truncated. see log file for complete stacktrace

这里是 weblogic.xml

    <?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd">
<wls:weblogic-version>12.1.3</wls:weblogic-version>
<wls:context-root>demoRest</wls:context-root>
<wls:container-descriptor>
    <wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>
    <wls:prefer-application-packages>
        <!-- slf4j -->
        <wls:package-name>org.slf4j</wls:package-name>

        <!-- jersey-bundle-*.jar -->
        <wls:package-name>com.sun.jersey.*</wls:package-name>
        <wls:package-name>com.sun.research.ws.wadl.*</wls:package-name>
        <wls:package-name>com.sun.ws.rs.ext.*</wls:package-name>

        <!-- Jackson-*.jar -->
        <wls:package-name>org.codehaus.jackson.*</wls:package-name>

        <!-- jsr311*.jar -->
        <wls:package-name>javax.ws.rs.*</wls:package-name>

        <!-- javassist -->
        <wls:package-name>javassist.*</wls:package-name>
        <!-- aop repackaged -->
        <wls:package-name>org.aopalliance.*</wls:package-name>


        <wls:package-name>com.sun.jersey.*</wls:package-name>
        <wls:package-name>org.glassfish.jersey.*</wls:package-name>
        <wls:package-name>jersey.repackaged.org.objectweb.asm.*</wls:package-name>
        <wls:package-name>org.objectweb.asm.*</wls:package-name>
        <wls:package-name>com.sun.ws.rs.ext.*</wls:package-name>
        <wls:package-name>javax.ws.rs.*</wls:package-name>
        <wls:package-name>com.sun.research.ws.wadl.*</wls:package-name>
        <wls:package-name>jersey.repackaged.*</wls:package-name>

        <!-- hk2 -->
        <wls:package-name>org.glassfish.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.hk2.internal.*</wls:package-name>
        <wls:package-name>org.jvnet.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.tiger_types.*</wls:package-name>


        <!-- jpa2.1 hibernate -->
        <wls:package-name>javax.persistence.*</wls:package-name>
        <wls:package-name>org.hibernate.*</wls:package-name>
        <wls:package-name>org.hibernate.validator.*</wls:package-name>
        <wls:package-name>javax.validation.*</wls:package-name>

        <!-- commons io <wls:package-name>org.apache.commons.io.*</wls:package-name> -->
    </wls:prefer-application-packages>


    <wls:prefer-application-resources>
        <wls:resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</wls:resource-name>
        <wls:resource-name>META-INF/services/javax.ws.rs.ext.RuntimeDelegate</wls:resource-name>

        <!-- jersey -->
        <wls:resource-name>META-INF/services/org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>jersey.repackaged.*</wls:resource-name>

        <!-- hk2 -->
        <wls:resource-name>META-INF/services/org.glassfish.hk2.*</wls:resource-name>

        <!-- slf4j -->
        <wls:resource-name>org.slf4j</wls:resource-name>

        <!-- jersey-bundle-*.jar -->
        <wls:resource-name>com.sun.jersey.*</wls:resource-name>
        <wls:resource-name>com.sun.research.ws.wadl.*</wls:resource-name>
        <wls:resource-name>com.sun.ws.rs.ext.*</wls:resource-name>

        <!-- Jackson-*.jar -->
        <wls:resource-name>org.codehaus.jackson.*</wls:resource-name>

        <!-- jsr311*.jar -->
        <wls:resource-name>javax.ws.rs.*</wls:resource-name>

        <!-- jpa2.1 hibernate -->
        <wls:resource-name>javax.persistence.*</wls:resource-name>
        <wls:resource-name>org.hibernate.*</wls:resource-name>
        <wls:resource-name>org.hibernate.validator.*</wls:resource-name>
        <wls:resource-name>javax.validation.*</wls:resource-name>

        <!-- commons io -->
        <wls:resource-name>org.apache.commons.io.*</wls:resource-name>
    </wls:prefer-application-resources>
</wls:container-descriptor>

【问题讨论】:

标签: java jersey-2.0 weblogic12c


【解决方案1】:

检查duplicate topic,如果你绝对需要,你可以使用静态访问

HttpServletRequest request= 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

【讨论】:

    【解决方案2】:

    我遇到了同样的问题并找到了解决方法:我将请求注入移至方法声明,这对我有用:

        @GET
        public void test(@Context HttpServletRequest request){
            ...
        }
    

    【讨论】:

    • 这个方案不足以解决注入问题。
    【解决方案3】:

    我发现将其设为组件似乎存在一些问题,因此我不得不删除注释@Component。然后错误消失了。我看到 glassfish 这里提到了一些问题:Glassfish issue

    但我不确定这些问题是否已修复或与泽西岛有关。如果您可以不使用 @Component,那么这可能是目前最好的解决方案。

    【讨论】:

      【解决方案4】:

      在 weblogic 12c 中部署 rest 项目时,我也遇到了同样的问题,因为 jediz 建议尝试使用该解决方案。此外,您必须在 web.xml 中添加侦听器。

       <listener>
          <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
        </listener>
      

      【讨论】:

      • @Mohammad Abdullah.,添加此问题后也存在问题。org.glassfish.jersey.internal.Errors logErrors 警告:已检测到以下警告:警告:检测到未知 HK2 故障:MultiException 堆栈 1 4 java.lang.IllegalArgumentException:接口 org.glassfish.hk2.api.ProxyCtl 在类加载器中不可见
      • @Madhesh , 在部署 Restful Web 服务应用程序之前,v 必须在 weblogic 中注册 Web 服务。请关注此link. 部署此战争后,重新启动托管 Web 服务器并部署 Web 服务应用程序。
      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多