2010-07-29 18 views
1

我正在使用Guice servlet模塊並試圖獲取基本過濾器和偵聽器的運行。當我啓動我的servlet容器時,我得到一個封裝在AssertionError中的java.lang.IllegalAccessException。Guice Servlet項目在啓動時失敗IllegalAccessException

基本上,似乎發生的事情是,Guice試圖實例化com.google.inject.servlet.ManagedServletPipeline,它是一個使用公共構造函數的包 - 私有類。在使用包私有類之前,我已經看到了Guice的這個問題,並且解決方案一直是簡單地將構造函數的可見性從public更改爲default。這裏的問題是,ManagedServletPipeline是一個框架類,因此我沒有真正的權限修改它。我認爲我做錯了什麼,因爲這是最基本的例子。

有誰知道我該如何解決這個問題?

完整的堆棧跟蹤和相關文件包含在下面。僅供參考我正在嘗試在Apache Tomcat v6上運行此操作。

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 

    <display-name>guice-test</display-name> 

    <listener> 
     <listener-class>com.example.MyServletConfig</listener-class> 
    </listener> 

    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

MyServletConfig.java:

package com.example; 

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.servlet.GuiceServletContextListener; 
import com.google.inject.servlet.ServletModule; 

public class MyServletConfig extends GuiceServletContextListener{ 

    @Override 
    protected Injector getInjector(){ 
     return Guice.createInjector(new ServletModule()); 
    } 
} 

堆棧跟蹤:

java.lang.AssertionError: java.lang.IllegalAccessException: Class com.google.inject.DefaultConstructionProxyFactory$1 can not access a member of class com.google.inject.servlet.ManagedServletPipeline with modifiers "public" 
    at com.google.inject.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:85) 
    at com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:85) 
    at com.google.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:111) 
    at com.google.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:45) 
    at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:811) 
    at com.google.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:42) 
    at com.google.inject.Scopes$1$1.get(Scopes.java:54) 
    at com.google.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:48) 
    at com.google.inject.SingleParameterInjector.inject(SingleParameterInjector.java:42) 
    at com.google.inject.SingleParameterInjector.getAll(SingleParameterInjector.java:66) 
    at com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:84) 
    at com.google.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:111) 
    at com.google.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:45) 
    at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:811) 
    at com.google.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:42) 
    at com.google.inject.Scopes$1$1.get(Scopes.java:54) 
    at com.google.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:48) 
    at com.google.inject.FactoryProxy.get(FactoryProxy.java:56) 
    at com.google.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:45) 
    at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:811) 
    at com.google.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:42) 
    at com.google.inject.Scopes$1$1.get(Scopes.java:54) 
    at com.google.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:48) 
    at com.google.inject.SingleParameterInjector.inject(SingleParameterInjector.java:42) 
    at com.google.inject.SingleParameterInjector.getAll(SingleParameterInjector.java:66) 
    at com.google.inject.SingleMethodInjector.inject(SingleMethodInjector.java:84) 
    at com.google.inject.InjectionRequestProcessor$StaticInjection$1.call(InjectionRequestProcessor.java:109) 
    at com.google.inject.InjectionRequestProcessor$StaticInjection$1.call(InjectionRequestProcessor.java:106) 
    at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:804) 
    at com.google.inject.InjectionRequestProcessor$StaticInjection.injectMembers(InjectionRequestProcessor.java:106) 
    at com.google.inject.InjectionRequestProcessor.injectMembers(InjectionRequestProcessor.java:74) 
    at com.google.inject.InjectorBuilder.injectDynamically(InjectorBuilder.java:168) 
    at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:113) 
    at com.google.inject.Guice.createInjector(Guice.java:92) 
    at com.google.inject.Guice.createInjector(Guice.java:69) 
    at com.google.inject.Guice.createInjector(Guice.java:59) 
    at com.example.MyServletConfig.getInjector(MyServletConfig.java:12) 
    at com.google.inject.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:43) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:722) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:593) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 
Caused by: java.lang.IllegalAccessException: Class com.google.inject.DefaultConstructionProxyFactory$1 can not access a member of class com.google.inject.servlet.ManagedServletPipeline with modifiers "public" 
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:505) 
    at com.google.inject.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:81) 
    ... 52 more 

回答

3

看來,使用吉斯 - 2.0.jar代替guice- 2.0-no_aop.jar修復了這個問題。

儘管項目本身沒有使用任何AOP功能,但似乎servlet模塊出於某種原因需要它。