2

我将 Grizzly 与 Jersey 2.1 一起使用。我想为记录目的添加一个方面(在每个方法执行之前和之后)。不使用 Spring 或 Google-Guice 可以做到这一点吗?

谢谢

4

1 回答 1

4

您可以通过使用 Jersey 提供的监控功能(特别是通过事件侦听器)来实现非常相似的功能。基本上,您需要创建和注册ApplicationEventListenerRequestEventListener的实例,您将在其中监听RESOURCE_METHOD_STARTRESOURCE_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;
    }
}

注意:这些事件仅围绕“待执行”资源方法触发,而不是针对可能在资源匹配阶段执行的子资源定位器。


编辑 1

要记录每个调用的方法(甚至是从 JAX-RS 资源方法调用的方法),请参阅AspectJ项目。

于 2013-08-19T18:51:40.687 回答