2017-01-03 4 views
0

Ich fange an, ein Grizzly-Server wie folgt:Jersey + Spring - Spritzen Servlet Anfrage

URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build(); 

ResourceConfig resourceConfig = new ResourceConfig(); 
resourceConfig.packages("com.example"); 
resourceConfig.property("contextConfig", applicationContext); 

HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, resourceConfig, false); 

server.start(); 

Im Paket com.example, ich habe Filter wie folgt:

@Component 
@Provider 
@Priority(0) 
public class MyFilter implements ContainerRequestFilter { 

    @Context 
    private HttpServletRequest httpServletRequest; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     /* httpServletRequest is null here */ 
    } 
} 

Meine Der Filter wird wie von Spring erwartet instanziiert. JAX-RS hat es erkannt und verwendet dieselbe Instanz, die von Spring instanziiert wurde. Ich versuche auf den zugrunde liegenden HttpServletRequest zugreifen, aber ich kann nicht finden, wie.

Ich bin mir bewusst, dass die Servlet-Anfrage wird nie injiziert werden, bis die Filterinstanz als Proxy erstellt wird, da die Servlet-Anfrage Anfrage Bereich ist. Ich habe versucht, den Filter mit @RequestScope, das gleiche Ding zu kommentieren.

Antwort

1

Sie müssen die GrizzlyWebContainerFactory von

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-grizzly2-servlet</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

verwenden, wenn Sie Servlet-Container erstellen möchten. Momentan erstellen Sie keinen Servlet-Container, deshalb gibt es kein HttpServletRequest.

Sie können etwas tun, wie

GrizzlyWebContainerFactory.create(baseUri, new ServletContainer(resourceConfig)); 
+0

Ist es möglich, nicht ein Servlet-Container zu benutzen? Wenn Sie eine servletbasierte Bereitstellung verwenden, erwartet der Komponentenanbieter der Spring-Komponente einen WebApplicationContext, während mein Kontext eigenständig AnnotationConfigApplicationContext ist. –

+0

Wenn meine Anwendung gestartet wird, wird der Stammanwendungskontext basierend auf einer Spring-Konfigurationsklasse erstellt. Ich möchte, dass dieser Stammkontext für Jersey verfügbar ist, daher habe ich die Eigenschaft contextConfig festgelegt. Diese Eigenschaft ist jedoch irrelevant, wenn der Servlet-Container verwendet wird und in diesem Fall ein WebApplicationContext unter dem Servlet-Attribut org.springframework.web.context.WebApplicationContext.ROOT erwartet wird. –

+0

Nicht wirklich, da es eine Servlet-API ist. Auf was willst du zugreifen? Sie können den Grizzly 'Request' mit' @ Context' injizieren. Vielleicht gibt dir das genug Informationen. –

Verwandte Themen