2010-07-29 5 views
1

J'utilise le module de servlet Guice et j'essaie de ne faire fonctionner que le filtre de base et l'écouteur. Lorsque je démarre mon conteneur de servlets, j'obtiens une java.lang.IllegalAccessException enveloppée dans une AssertionError.Le projet Guice Servlet échoue avec IllegalAccessException au démarrage

Fondamentalement, ce qui semble se produire est que Guice essaye d'instancier com.google.inject.servlet.ManagedServletPipeline qui est une classe de paquetage privée utilisant un constructeur public. J'ai déjà vu ce problème avec Guice lorsque j'utilise des classes paquet-private, et la solution a toujours été de simplement changer la visibilité du constructeur de public à default. Le problème ici est que ManagedServletPipeline est une classe de framework et donc je n'ai pas vraiment accès pour la modifier. Je suppose que je fais quelque chose de mal puisque cela se manifeste dans les exemples les plus basiques.

Est-ce que quelqu'un sait comment je peux contourner ce problème?

La pile complète et les fichiers pertinents sont inclus ci-dessous. Pour info, j'essaye de lancer ceci sur 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()); 
    } 
} 

Stack Trace:

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 

Répondre

3

Il semble que l'utilisation du Guice-2.0.jar au lieu de guice- 2.0-no_aop.jar résout ce problème.

Même si le projet lui-même n'utilise aucune fonctionnalité AOP, il semble que le module de servlet l'exige pour une raison quelconque.

Questions connexes