2016-04-11 10 views
7

Ich habe ein kleines Problem, wenn ich versuche, Guice mit ContainerRequestFilter zu verwenden, es wirft eine NullPointerException. Ich habe ein wenig in RESTEasy gegraben und es scheint, dass es keinen Konstruktor für MyFilter finden kann, da die @Context-Annotation nicht vorhanden ist. Die NullPointerException wird ausgelöst, wenn versucht wird, einen Null-Konstruktor zu instanziieren.RESTEasy Guice Provider

Mein Filter:

@Provider 
@PreMatching 
public class MyFilter implements ContainerRequestFilter { 
    private Dependency d; 

    @Inject 
    public MyFilter(Dependency d) { 
     this.d = d; 
    } 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     if (d.doSomething()) { 
      Response r = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); 
      containerRequestContext.abortWith(r); 
     } 
    } 
} 

ich den Filter in meine Anwendungsklasse hinzugefügt haben:

@ApplicationPath("") 
public class Main extends Application { 
    private Set<Object> singletons = new HashSet<Object>(); 
    private Set<Class<?>> c = new HashSet<Class<?>>(); 

    public Main() { 
     c.add(Dependency.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return c; 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

Meine Guice Konfiguration:

public class GuiceConfigurator implements Module { 
    public void configure(final Binder binder) { 
     binder.bind(Dependency.class); 
    } 
} 

Mein web.xml:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 

    <display-name>My App</display-name> 

    <context-param> 
     <param-name>resteasy.guice.modules</param-name> 
     <param-value>com.example.GuiceConfigurator</param-value> 
    </context-param> 

    <listener> 
     <listener-class> 
      org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener 
     </listener-class> 
    </listener> 
</web-app> 

Diese Konfiguration funktioniert, um meine Abhängigkeiten in Ressourcen zu injizieren, aber ich bekomme eine NullPointerException, wenn ich versuche, sie in einem Provider zu verwenden.

Jede Hilfe wäre willkommen.

Antwort

4

Es scheint, dass Sie selbst mit RESTeasy/JAX-RS-Komponenten immer noch mit dem Guice-Binder registrieren müssen. Ich war mir zunächst nicht sicher, aber wenn wir uns die test cases ansehen, scheint es, als müssten wir unsere Ressourcen und Anbieter bei Guice registrieren, damit es funktioniert.

Ich teste es nach dem Hinzufügen des Filters zum Guice-Modul, und es funktioniert wie erwartet.

public class GuiceConfigurator implements Module { 
    public void configure(final Binder binder) { 
     binder.bind(MyFilter.class); 
     binder.bind(Dependency.class); 
    } 
} 

Um zu testen, ging ich die example from the RESTeasy project, habe einen Filter mit der Konstruktor Injektion, und hinzugefügt, um die Filter an das Modul Bindemittel ab. Und es funktionierte, wenn der Filter dem Modul hinzugefügt wurde, und fehlgeschlagen, wenn es nicht hinzugefügt wurde.

+0

_ "RESTEasy hat eine einfache Integration mit Guice 3.0. RESTEasy wird die Binding-Typen für ein Guice-Modul nach Pfad- und Provider-Annotationen scannen. Diese Bindungen werden mit RESTEasy registriert." _ (Https://docs.jboss.org /resteasy/docs/3.0.9.Final/userguide/html/Guice1.html). Mit anderen Worten, ja, Sie müssen sie binden. – Sam