【问题标题】:How to inject hk2 servicelocator in a jersey jax-rs app如何在 jersey jax-rs 应用程序中注入 hk2 servicelocator
【发布时间】:2018-04-13 05:39:21
【问题描述】:

我正在迁移一个遗留服务框架,该框架使用 java 序列化/反射来注册服务并将它们作为远程端点(通过 http 的 javabin)或无缝调用本地调用。 我已将远程调用替换为球衣端点。还使用了基于 hk2 aop 的拦截器来重新创建当前框架的一些拦截能力。当远程客户端调用端点时它工作正常。 现在我需要对服务方法的本地调用做同样的事情,并且能够使用与远程服务方法调用相同的拦截逻辑

(实现了 org.glassfish.hk2.api.InterceptionService - 基于这篇文章 - https://blog.dejavu.sk/2015/01/21/intercepting-jersey-resource-method-calls/

我相信如果我能够从 hk2 注册表/定位器中获取服务(jax-rs 资源)类的实例,那么方法调用将调用相同的注册拦截器。如何实现?

【问题讨论】:

  • 像其他服务一样注入它@Inject ServiceLocator locator
  • 谢谢,注入作品,注册的实例可以找回了。 jvm-local 调用也会调用拦截器。 service=locator.getAllServiceHandles(<Restservice>.class, new Annotation[0]);service.callInterceptedMethod();
  • 一个相关提示 - 在没有球衣的原始 HttpServer 中使用 hk2 ServiceLocator 时 - 在单例范围内注册了绑定的服务,但在实现服务时出现以下错误 -
    “服务需要任一方法或构造函数拦截,但代理不可用”
    原因是Utilities.proxiesAvailable返回false,因为javassist jar不在类路径中。如果你想用它做任何有用的事情,javassist 是 hk2 的强制依赖项。

标签: jersey interceptor hk2


【解决方案1】:

正如Paul 在 cmets 中所说,您始终可以只使用@Inject 或查找 ServiceLocator。其实就是ID最低的服务(hk2系统中加入的第一个服务)。

对于子定位器,您通常会在父 ServiceLocator 之前获得子 ServiceLocator,除非您对查询执行非常具体的操作。这是因为重复服务的规则是选择具有最高定位器 id 的服务(将是子服务)

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2013-02-15
    • 2015-06-13
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多