2013-04-02 5 views
7

Ich versuche, einen injizierten Kontext (zum Beispiel Session oder HttpServletRequest) in einem Servlet zu bekommen, das ich auf Grizzly geschrieben habe, aber nichts, was ich tue, scheint zu funktionieren. Der ganze Prozess scheint mit dem folgenden Fehler nicht vorzeitig zum Stillstand kommen:Grizzly und ServletContainerContext

SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr 

Der Server ist tot einfach, es besteht aus zwei Dateien, der statischen Eintrittspunkt (Main.java):

package com.test.server; 

import java.io.IOException; 
import java.net.URI; 
import javax.ws.rs.core.UriBuilder; 

import org.glassfish.grizzly.http.server.HttpServer; 
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory; 
import com.sun.jersey.api.core.ClassNamesResourceConfig; 
import com.sun.jersey.api.core.ResourceConfig; 

public class Main { 

    private static URI getBaseURI() { 
     return UriBuilder.fromUri("http://localhost/").port(8080).build(); 
    } 

    public static final URI BASE_URI = getBaseURI(); 

    public static void main(String[] args) throws IOException { 
     ResourceConfig rc = new ClassNamesResourceConfig(LolCat.class); 
     HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc); 
     System.in.read(); 
     httpServer.stop(); 
    } 
} 

und die serlvet (LolCat.java):

package com.test.server; 

import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Context; 

@Path(value = "/lol") 
public class LolCat { 

    @Context HttpServletRequest hsr; 

    @GET 
    @Path(value="/cat") 
    public String list() { 
     return "meow"; 
    } 

} 

Insbesondere ist es die @ Context-Linie in der obigen Quelldatei, die die Quelle und Lösung all meiner Probleme ist. Ich brauche es, und nach allem, was ich über Jersey und Servlets gelesen habe, sollte es funktionieren, aber leider nicht. Ich habe auch versucht, GrizzlyWebContainerFactory anstelle der GrizzlyServerFactory zu verwenden, aber ohne Erfolg.

Als Referenz wird das Projekt mit folgenden Abhängigkeiten zusammengestellt:

  • org.glassfish.grizzly: Grizzly-Rahmen: jar: 2.2.21
  • org.glassfish.grizzly: Grizzly-http: Glas: 2.2.21
  • org.glassfish.grizzly: grizzly-http-Servlet: jar: 2.2.21
  • org.glassfish.grizzly: grizzly-http-Server: jar: 2.2.21
  • com. sun.jersey: Jersey-Server: Glas: 1.17
  • com.sun.jersey: Trikot-Servlet: jar: 1,17
  • com.sun.jersey: Trikot-Kern: jar: 1,17
  • javax.servlet: javax.servlet-api: jar: 2.5.0
  • com.sun.jersey: Trikot-grizzly2: jar: 1,17
  • com.sun.jersey: Jersey-grizzly2-Servlet: jar: 1,17
  • asm: asm: jar: 3.3.1

Antwort

3

Diese Hauptklasse funktioniert gut für mich:

package com.test.server; 

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory; 
import java.io.IOException; 
import java.net.URI; 
import javax.ws.rs.core.UriBuilder; 

import com.sun.jersey.api.core.ClassNamesResourceConfig; 
import com.sun.jersey.spi.container.servlet.ServletContainer; 
import org.glassfish.grizzly.http.server.HttpHandler; 
import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.grizzly.http.server.Request; 
import org.glassfish.grizzly.http.server.Response; 
import org.glassfish.grizzly.servlet.ServletRegistration; 
import org.glassfish.grizzly.servlet.WebappContext; 

public class Main { 
    private static final String JERSEY_SERVLET_CONTEXT_PATH = ""; 

    private static URI getBaseURI() { 
     return UriBuilder.fromUri("http://localhost").port(8080).path("/").build(); 
    } 

    public static final URI BASE_URI = getBaseURI(); 

    public static void main(String[] args) throws IOException { 
     // Create HttpServer and register dummy "not found" HttpHandler 
     HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, new HttpHandler() { 

      @Override 
      public void service(Request rqst, Response rspns) throws Exception { 
       rspns.setStatus(404, "Not found"); 
       rspns.getWriter().write("404: not found"); 
      } 
     }); 

     // Initialize and register Jersey Servlet 
     WebappContext context = new WebappContext("WebappContext", JERSEY_SERVLET_CONTEXT_PATH); 
     ServletRegistration registration = context.addServlet("ServletContainer", ServletContainer.class); 
     registration.setInitParameter(ServletContainer.RESOURCE_CONFIG_CLASS, 
       ClassNamesResourceConfig.class.getName()); 
     registration.setInitParameter(ClassNamesResourceConfig.PROPERTY_CLASSNAMES, LolCat.class.getName()); 
     registration.addMapping("/*"); 
     context.deploy(httpServer); 

     System.in.read(); 
     httpServer.stop(); 
    } 
} 

Versuchen Sie http://localhost:8080/lol/cat in Ihrem Browser. Sie können JERSEY_SERVLET_CONTEXT_PATH ändern, um den Servlet-Kontextpfad zu aktualisieren.

+0

Es funktionierte, mit der Typsicherheit von Klartext :). Ist es möglich, eine Klasse ohne den String/String setInitParameter zu registrieren? – Mic

+0

Ich denke, Jersey GrizzlyWebContainerFactory könnte erweitert/verbessert werden, so dass Sie nicht mit Init-Parameter beschäftigen müssen, aber es wird sowieso ein Wrapper über den gleichen WebappContext-Registrierungscode sein. – alexey

+0

Hilfe! .. Mein Code geht so weit wie 'WebappContext context = neuer WebappContext (...' dann stürzt er plötzlich mit 'Exception im Thread" main "java.lang.NoSuchMethodError: org.glassfish.grizzly.utils.DataStructures ab. getConcurrentMap (IFI) Ljava/util/concurrent/ConcurrentMap; '. Versucht mit Java 7 und 8, Trikot-Container-Grizzly-http: 2.5 und Jersey-Container-Grizzly2-Servlet: 2.5 –

4

Laut Entwickler Erklärungen - Grizzly ist nicht vollständig kompatibel zu JAX-RS 2.0, so wird es keine offiziellen Kontexte Injektionen/Verpackung. Siehe Jersey Bug-1960 Anwendbar für Jersey + Grizzly Version 2.7+

Zum Glück gibt es eine Möglichkeit, Grizzly Request/Response Objekte zu injizieren. Etwas knifflig, aber funktioniert Codebeispiel in einem von Jersey's Unit Tests zur Verfügung gestellt.Siehe Jersey container test

So wird Codefragment sein:

import javax.inject.Inject; 
import javax.inject.Provider; 

public someclass { 
    @Inject 
    private Provider<Request> grizzlyRequestProvider; 

    public void method() { 
     if (grizzlyRequestProvider != null) { 
      Request httpRequest = grizzlyRequestProvider.get(); 

      // Extract what you need 
     } 
    } 
} 

feine Arbeiten sowohl für Filter und Servicemethoden

1

Sie können auch eine ResourceContext manuell registrieren

HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI()); 

    WebappContext context = new WebappContext("WebappContext", "/api"); 
    ServletRegistration registration = context.addServlet("ServletContainer", 
    new ServletContainer(config)); 
    registration.addMapping("/*"); 
    context.deploy(httpServer); 

Wo Config Ihre Ressource Kontext.

Verwandte Themen