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>
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. –