我将 Grizzly 与 Jersey 2.1 一起使用。我想为记录目的添加一个方面(在每个方法执行之前和之后)。不使用 Spring 或 Google-Guice 可以做到这一点吗?
谢谢
您可以通过使用 Jersey 提供的监控功能(特别是通过事件侦听器)来实现非常相似的功能。基本上,您需要创建和注册ApplicationEventListener和RequestEventListener的实例,您将在其中监听RESOURCE_METHOD_START和RESOURCE_METHOD_FINISHED事件。
@Provider
public class MyApplicationEventListener implements ApplicationEventListener {
@Override
public void onEvent(ApplicationEvent event) {
// NOOP.
}
@Override
public RequestEventListener onRequest(RequestEvent requestEvent) {
return new RequestEventListener() {
@Override
public void onEvent(final RequestEvent event) {
switch (event.getType()) {
case RESOURCE_METHOD_START:
logMethod(event.getUriInfo(), true);
break;
case RESOURCE_METHOD_FINISHED:
logMethod(event.getUriInfo(), false);
break;
}
}
private void logMethod(final ExtendedUriInfo uriInfo, final boolean entering) {
final Class<?> resource = uriInfo
.getMatchedResources().get(0).getClass();
final Method method = uriInfo
.getMatchedResourceMethod()
.getInvocable()
.getHandlingMethod();
if (entering) {
logger.entering(resource.toString(), method.toString());
} else {
logger.exiting(resource.toString(), method.toString());
}
}
};
}
}
将侦听器注册到您的应用程序中:
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final HashSet<Class<?>> classes = new HashSet<Class<?>>();
// Add root resources.
classes.add(HelloWorldResource.class);
// Add ApplicationEventListener.
classes.add(MyApplicationEventListener.class);
return classes;
}
}
注意:这些事件仅围绕“待执行”资源方法触发,而不是针对可能在资源匹配阶段执行的子资源定位器。
要记录每个调用的方法(甚至是从 JAX-RS 资源方法调用的方法),请参阅AspectJ项目。