我在Jersey 2.26中有以下RequestEventListener:
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;
}
}
}
我尝试注入一个灰熊的http Request对象,当我使用RequestFilter而不是EventListener时,它就像那样工作。但是我得到关于request
对象的NullPointerException。
是否可以在RequestEventListener中以该(或任何其他)方式获取请求的IP地址?
提前致谢, 罗布
答案 0 :(得分:0)
可能是因为你只是在实例化它。你不能指望它以这种方式注入。您可以做的是将它(Provider<Request>
注入ApplicationEventListener
并将其传递给请求侦听器构造函数。或者您可以将ServiceLocator
(InjectionManager
注入2.26 +) ApplicationEventListener
并调用locator.inject(requestListener)
。这将明确地注入请求侦听器。