Grizzly und ServletContainerContext
Ich versuche zu ergattern, injiziert Kontext (z.B. Session oder HttpServletRequest) in einen Servlet-Container, den ich geschrieben habe, läuft auf Grizzly, aber nichts, was ich tun scheint zu funktionieren. Der ganze Prozess scheint zu hängen eher vorzeitig mit der folgenden Fehlermeldung:
SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr
Dem server ist tot einfach, es besteht aus zwei Dateien, die statischen Einstiegspunkt (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 das 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";
}
}
Speziell, es ist der @Context-Zeile im obigen Quellcode-Datei, die die Quelle und Lösung für alle meine Probleme. Ich brauche es, und nach allem, was ich gelesen habe, über Jersey und Servlets sollte es funktionieren, aber leider ist es nicht. Ich habe auch versucht, mit Hilfe GrizzlyWebContainerFactory statt der GrizzlyServerFactory, aber ohne Erfolg.
Referenz, das Projekt kompiliert wird mit den folgenden Abhängigkeiten:
- org.glassfish.grizzly:grizzly-Rahmen:Glas:2.2.21
- org.glassfish.grizzly:grizzly-http:jar:2.2.21
- org.glassfish.grizzly:grizzly-http-servlet:jar:2.2.21
- org.glassfish.grizzly:grizzly-http-server:jar:2.2.21
- com.Sonne.jersey:jersey-server:jar:1.17
- com.Sonne.jersey:jersey-servlet:jar:1.17
- com.Sonne.jersey:jersey-core:jar:1.17
- javax.servlet:javax.servlet-api:jar:2.5.0
- com.Sonne.jersey:jersey-grizzly2:jar:1.17
- com.Sonne.jersey:jersey-grizzly2-servlet:jar:1.17
- asm:asm:jar:3.3.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Main-Klasse funktioniert gut für mich:
Versuchen
http://localhost:8080/lol/cat
in Ihrem browser.Sie können ändern, JERSEY_SERVLET_CONTEXT_PATH zu aktualisieren Servlet-Kontext-Pfad.
WebappContext context = new WebappContext(...
dann ist es plötzlich stürzt mitException in thread "main" java.lang.NoSuchMethodError: org.glassfish.grizzly.utils.DataStructures.getConcurrentMap(IFI)Ljava/util/concurrent/ConcurrentMap;
. Habe versucht mit Java 7 und 8, mit jersey-container-grizzly-http:2,5 und jersey-container-grizzly2-servlet:2.5<groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-grizzly2-servlet</artifactId>
.. bis ..<groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-http-servlet</artifactId>
... das hatte mir mein Haar ziehen!!Als pro-Entwickler Erklärungen - Grizzly ist nicht vollständig konform zur JAX-RS 2.0, es gibt also keinen offiziellen Kontexten Injektionen/Verpackung. Sehen Jersey Bug-1960
Anwendbar für Jersey + Grizzly-version 2.7+
Glücklicherweise gibt es einen Weg, um zu injizieren, Grizzly request/response-Objekte. Etwas tricky, aber funktioniert
Beispielcode in ein Trikot, die unit-tests. Sehen Jersey-container testen
Code-fragment wird:
Funktioniert gut, sowohl für Filter-und service-Methoden
Können Sie auch manuell registrieren Sie einen ResourceContext
Wo die config ist Ihre Ressource-Kontext.