Java Jersey:检测何时创建控制器类
我已经使用Jersey 2.24实现了一个JAX-RS服务器应用程序 我使用Guice-HK2桥,以便控制器类(那些用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,我想我可以使用泛型提
@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
关键字创建的,没有被注入。是的,你说得对。我想我在用一堆不同的东西做实验。