2015-04-30 17 views
9

Per vedere il codice completo per questo problema, consulta questo githubJersey: ContainerRequestFilter non ottiene Contesto ServletRequest

https://github.com/mobiusinversion/web-application

Ho anche creato il Jersey Jira

https://java.net/jira/browse/JERSEY-2851

Sono lavorare su un ContainerRequestFilter utilizzando Jersey 2.15. Questa è un'app Jetty incorporata che è ombreggiata in un singolo barattolo.

Nel avviamento Jetty (classe principale):

public static void main(String[] args) throws Exception { 
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath("/"); 
    Server jettyServer = new Server(10005); 
    jettyServer.setHandler(context); 
    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*"); 
    jerseyServlet.setInitOrder(0); 
    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, ServletConstants.COMPONENT_SCAN_ROOT); 

    try { 
     System.out.println("Starting Jetty"); 
     jettyServer.start(); 
     System.out.println("Jetty Started"); 
     jettyServer.join(); 
    } catch (Exception e) { 
     System.out.println("Could not start server"); 
     e.printStackTrace(); 
    } finally { 
     jettyServer.destroy(); 
    } 
} 

ho un filtro che è incluso tramite un provider

@Provider 
public class ExampleProvider implements DynamicFeature { 

    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) { 
     ExampleFilter exampleFilter = new ExampleFilter(); 
     featureContext.register(exampleFilter); 
    } 
} 

Poi nel filtro:

public class ExampleFilter implements ContainerRequestFilter { 

    private static final Logger logger = LoggerFactory.getLogger(ExampleFilter.class); 

    @Context 
    private HttpServletRequest servletRequest; 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     logger.info("IP ADDRESS " + servletRequest.getRemoteAddr()); 
     // ... 
    } 

} 

Tuttavia questo produce uno NullPointerException:

Caused by: java.lang.NullPointerException: null 
at com.example.filters.ExampleFilter.filter(ExampleFilter.java:29) 
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:131) 
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:67) 

Cosa sto facendo male e come posso risolvere questo problema?

UPDATE: Compreso pom entried per Jetty e Jersey

<properties> 
     <jersey.version>2.15</jersey.version> 
     <jetty.version>9.2.6.v20141205</jetty.version> 
    </properties> 

    <!-- Jersey --> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey</groupId> 
     <artifactId>jersey-bom</artifactId> 
     <version>${jersey.version}</version> 
     <type>pom</type> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Jetty --> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-server</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlet</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlets</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
+0

Sono abbastanza sicuro che funzionerà poiché questo problema non viene segnalato in tali circostanze. Hai dato un'occhiata al github? È estremamente nudo. È chiaro o Jetty o Jersey o la combinazione dei due ha un bug in questo caso. Questa abbondanza consiste nel trovare una soluzione che non implichi l'attesa di risposta da parte di entrambi i gruppi. Certo, una soluzione è abbandonare del tutto Jetty ma preferirei non farlo. –

risposta

12

L'errore è stato che si è creato manualmente un'istanza ExampleRequestLoggingFilter all'interno del ExampleRequestFilterProvider. L'iniezione delle dipendenze funziona solo su istanze create e gestite dal contenitore stesso, come ad esempio ExampleRequestFilterProvider. Questo spiega perché l'iniezione @Context non sembra funzionare nell'istanza creata manualmente.

Una soluzione sarebbe spostare il punto di iniezione su ExampleRequestFilterProvider e quindi passarlo al costruttore di ExampleRequestLoggingFilter.

@Provider 
public class ExampleRequestFilterProvider implements DynamicFeature { 

    @Context 
    private HttpServletRequest request; 

    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) { 
     ExampleRequestLoggingFilter exampleRequestLoggingFilter = new ExampleRequestLoggingFilter(request); 
     featureContext.register(exampleRequestLoggingFilter); 
    } 

} 

L'ho provato qui (complimenti per il progetto Git!) E ha funzionato per me.

Si noti che non si sta passando l'istanza effettiva HttpServletRequest, ma un proxy gestito dal contenitore che delega ulteriormente l'istanza effettiva su ogni chiamata di metodo, quindi non c'è nulla di cui preoccuparsi per l'integrità e la sicurezza del thread qui.

+0

Bam, così ... Grazie amico, questo mi ha davvero aiutato. Chiaramente ho bisogno di colpire i libri su come funzionano meglio queste cose. Posso solo assegnare la taglia in 22 ore ma lo farò. Grazie mille. –

+1

Prego. Non avere fretta con la taglia. Potresti anche lasciarlo aperto fino alla scadenza (e ottenere l'auto-award). Ciò aumenta la possibilità di ottenere voti positivi da persone che sfogliano le domande di taglie (in modo da poter ottenere il rimborso), in particolare durante il giorno prima della scadenza. – BalusC

+0

Suona alla grande, lo farà. Saluti. –

Problemi correlati