2017-10-17 9 views
0

Je le RequestEventListener suivant à Jersey 2,26:Get Demande IP à Jersey Demande d'événement Listener

package com.myapp.webservice; 

import org.glassfish.grizzly.http.server.Request; 
import org.glassfish.jersey.server.monitoring.RequestEvent; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import javax.ws.rs.core.Context; 

public class RequestEventListener implements org.glassfish.jersey.server.monitoring.RequestEventListener { 
    private static final Logger logger = LoggerFactory.getLogger(RequestEventListener.class); 
    private final long startTime; 

    @Context 
    private javax.inject.Provider<Request> request; 

    RequestEventListener() { 
     startTime = System.currentTimeMillis(); 
    } 

    @Override 
    public void onEvent(RequestEvent requestEvent) { 
     switch(requestEvent.getType()) { 
      case RESOURCE_METHOD_START: 
       try { 
        logger.info("HTTPRequest {} /{} {}", requestEvent.getContainerRequest().getMethod(), requestEvent.getContainerRequest().getUriInfo().getPath(), request.get().getRemoteAddr()); 
       } catch (Exception e) { 
        logger.error("Exception {}", e); 
       } 
       break; 

      case FINISHED: 
       logger.info("HTTPResponse {} /{} {}", requestEvent.getContainerResponse().getLength(), requestEvent.getContainerRequest().getUriInfo().getPath(), System.currentTimeMillis() - startTime); 
       break; 
     } 
    } 
} 

J'ai essayé d'injecter l'objet grizzly http demande, qui fonctionne comme ça quand j'utilise un RequestFilter à la place un EventListener. Mais je reçois NullPointerException concernant l'objet request.

Est-il possible d'obtenir l'adresse IP de la requête de cette manière (ou de toute autre manière) dans un RequestEventListener?

Merci à l'avance, Rob

Répondre

0

Probablement parce que vous êtes juste instancier. Vous ne pouvez pas vous attendre à ce qu'il soit injecté de cette façon. Ce que vous pouvez faire est de l'injecter (le Provider<Request> dans le ApplicationEventListener et transmettre le constructeur auditeur demande. Ou vous pouvez injecter le ServiceLocator (InjectionManager pour 2.26+) dans le ApplicationEventListener et appelez locator.inject(requestListener). Cela injecterait explicitement l'auditeur de demande.