Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey:检测何时创建控制器类_Java_Rest_Jax Rs_Jersey 2.0 - Fatal编程技术网

Java Jersey:检测何时创建控制器类

Java Jersey:检测何时创建控制器类,java,rest,jax-rs,jersey-2.0,Java,Rest,Jax Rs,Jersey 2.0,我已经使用Jersey 2.24实现了一个JAX-RS服务器应用程序 我使用Guice-HK2桥,以便控制器类(那些用@Path注释的类)被注入来自Guice的依赖项,而不是Jersey/HK2 然而,HK2仍然创建@Path注释类本身的实例 是否有一种方法可以插入Jersey/HK2,以便在创建@Path注释类时收到通知?像某种生命周期监听器?每次Jersey/HK2创建一个@Path注释类时,我都想对该类进行一些注册/记录 如果Guice正在实际创建带注释的类@Path,我想我可以使用泛型提

我已经使用Jersey 2.24实现了一个JAX-RS服务器应用程序

我使用Guice-HK2桥,以便控制器类(那些用
@Path
注释的类)被注入来自Guice的依赖项,而不是Jersey/HK2

然而,HK2仍然创建
@Path
注释类本身的实例

是否有一种方法可以插入Jersey/HK2,以便在创建
@Path
注释类时收到通知?像某种生命周期监听器?每次Jersey/HK2创建一个
@Path
注释类时,我都想对该类进行一些注册/记录

如果Guice正在实际创建带注释的类
@Path
,我想我可以使用泛型
提供程序来创建,但在这种情况下,这不可用,因为Jersey/HK2正在创建实际实例


谢谢

我认为侵入性最小的方法是只使用AOP。HK2提供AOP。您可以做的是创建一个
构造函数interceptor
。差不多

public class LoggingConstructorInterceptor implements ConstructorInterceptor {

    private static final Logger LOG
            = Logger.getLogger(LoggingConstructorInterceptor.class.getName());

    @Override
    public Object construct(ConstructorInvocation invocation) throws Throwable {
        Constructor ctor = invocation.getConstructor();
        LOG.log(Level.INFO, "Creating: {0}", ctor.getDeclaringClass().getName());

        // returned instance from constructor invocation.
        Object instance = invocation.proceed();
        LOG.log(Level.INFO, "Created Instance: {0}", instance.toString());

        return instance;
    }
}
然后创建一个
拦截器服务
,以便只对使用
@Path注释的类使用拦截器

public class PathInterceptionService implements InterceptionService {

    private static final ConstructorInterceptor CTOR_INTERCEPTOR
            = new LoggingConstructorInterceptor();
    private final static List<ConstructorInterceptor> CTOR_LIST
            = Collections.singletonList(CTOR_INTERCEPTOR);

    @Override
    public Filter getDescriptorFilter() {
        return BuilderHelper.allFilter();
    }

    @Override
    public List<MethodInterceptor> getMethodInterceptors(Method method) {
        return null;
    }

    @Override
    public List<ConstructorInterceptor> getConstructorInterceptors(Constructor<?> ctor) {
        if (ctor.getDeclaringClass().isAnnotationPresent(Path.class)) {
            return CTOR_LIST;
        }
        return null;
    }
}
请参阅中的完整示例

另请参见:


    • 我认为最不具侵扰性的方法是只使用AOP。HK2提供AOP。您可以做的是创建一个
      构造函数interceptor
      。差不多

      public class LoggingConstructorInterceptor implements ConstructorInterceptor {
      
          private static final Logger LOG
                  = Logger.getLogger(LoggingConstructorInterceptor.class.getName());
      
          @Override
          public Object construct(ConstructorInvocation invocation) throws Throwable {
              Constructor ctor = invocation.getConstructor();
              LOG.log(Level.INFO, "Creating: {0}", ctor.getDeclaringClass().getName());
      
              // returned instance from constructor invocation.
              Object instance = invocation.proceed();
              LOG.log(Level.INFO, "Created Instance: {0}", instance.toString());
      
              return instance;
          }
      }
      
      然后创建一个
      拦截器服务
      ,以便只对使用
      @Path注释的类使用拦截器

      public class PathInterceptionService implements InterceptionService {
      
          private static final ConstructorInterceptor CTOR_INTERCEPTOR
                  = new LoggingConstructorInterceptor();
          private final static List<ConstructorInterceptor> CTOR_LIST
                  = Collections.singletonList(CTOR_INTERCEPTOR);
      
          @Override
          public Filter getDescriptorFilter() {
              return BuilderHelper.allFilter();
          }
      
          @Override
          public List<MethodInterceptor> getMethodInterceptors(Method method) {
              return null;
          }
      
          @Override
          public List<ConstructorInterceptor> getConstructorInterceptors(Constructor<?> ctor) {
              if (ctor.getDeclaringClass().isAnnotationPresent(Path.class)) {
                  return CTOR_LIST;
              }
              return null;
          }
      }
      
      请参阅中的完整示例

      另请参见:


      真管用!!非常感谢你!!我注意到第91行的绑定是不必要的,因为类只是用
      new
      关键字创建的,没有被注入。是的,你说得对。我想我在用一堆不同的东西做实验。这很有效!!非常感谢你!!我注意到第91行的绑定是不必要的,因为类只是用
      new
      关键字创建的,没有被注入。是的,你说得对。我想我在用一堆不同的东西做实验。