Java 注入上下文HttpServletRequest原因“;接口org.glassfish.hk2.api.ProxyCtl在类加载器中不可见;(泽西岛2.21,weblogic 12.1.3)
我在WebLogic12c(12.1.3)上使用jersey 2.21来提供Rest。Rest类在不注入上下文HttpServletRequest/HTTPServletResponse的情况下工作正常。但是一旦注入上下文,调用服务时会抛出“interface org.glassfish.hk2.api.ProxyCtl不可见于类加载器”错误 下面是课堂:Java 注入上下文HttpServletRequest原因“;接口org.glassfish.hk2.api.ProxyCtl在类加载器中不可见;(泽西岛2.21,weblogic 12.1.3),java,jersey-2.0,weblogic12c,Java,Jersey 2.0,Weblogic12c,我在WebLogic12c(12.1.3)上使用jersey 2.21来提供Rest。Rest类在不注入上下文HttpServletRequest/HTTPServletResponse的情况下工作正常。但是一旦注入上下文,调用服务时会抛出“interface org.glassfish.hk2.api.ProxyCtl不可见于类加载器”错误 下面是课堂: import javax.servlet.http.HttpServletRequest; import javax.servlet.htt
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>
12.1.3
德莫雷斯特
假的
org.slf4j
泽西岛*
com.sun.research.ws.wadl*
com.sun.ws.rs.ext*
org.codehaus.jackson*
javax.ws.rs*
javassist*
org.aopalliance*
泽西岛*
org.glassfish.jersey*
jersey.repackaged.org.objectweb.asm*
org.objectweb.asm*
com.sun.ws.rs.ext*
javax.ws.rs*
com.sun.research.ws.wadl*
泽西,重新包装*
org.glassfish.hk2*
org.jvnet.hk2.internal*
org.jvnet.hk2*
org.jvnet.tiger_类型*
javax.persistence*
org.hibernate*
org.hibernate.validator*
javax.validation*
META-INF/services/javax.servlet.ServletContainerInitializer
META-INF/services/javax.ws.rs.ext.RuntimeDelegate
META-INF/services/org.glassfish.jersey*
org.glassfish.jersey*
泽西,重新包装*
META-INF/services/org.glassfish.hk2*
org.slf4j
泽西岛*
com.sun.research.ws.wadl*
com.sun.ws.rs.ext*
org.codehaus.jackson*
javax.ws.rs*
javax.persistence*
org.hibernate*
org.hibernate.validator*
javax.validation*
org.apache.commons.io*
我遇到了同样的问题,并找到了解决办法:我将请求注入移动到方法声明,这对我来说是可行的:
@GET
public void test(@Context HttpServletRequest request){
...
}
我发现将其作为组件似乎存在一些问题,因此我不得不删除注释@Component。然后错误消失了。我看到glassfish中提到了一些问题: 但我不确定这些是否已经修复或与泽西岛有关。如果您可以不使用@Component,那么这可能是目前最好的解决方案。检查,如果您必须使用静态访问,您可以使用静态访问
HttpServletRequest request=
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
在WebLogic12c中部署rest项目时,我也遇到了同样的问题,正如jediz所建议的那样,尝试使用该解决方案。此外,还必须在web.xml中添加侦听器
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
org.springframework.web.context.request.RequestContextListener
您找到解决此异常的解决方案了吗?找到解决方案了吗?可能是重复的一个Jersey bug,但它仍然存在:此解决方案不足以解决注射问题。@Mohammad Abdullah。,添加此项后,问题也存在。org.glassfish.jersey.internal.Errors日志错误警告:已检测到以下警告:警告:检测到未知HK2故障:4个java.lang.IllegalArgumentException中的多异常堆栈1:接口org.glassfish.HK2.api.ProxyCtl在类中不可见loader@Madhesh ,在部署RESTfulWeb服务应用程序之前,v必须在weblogic中注册web服务。部署此war后,请遵循此操作,然后重新启动托管web服务器并部署web服务应用程序。