当前位置: 首页 > 知识库问答 >
问题:

Scala中的DropWizard/Jersey/HK2依赖注入

韦嘉颖
2023-03-14

试图创建一个自定义的@context,我可以通过Jersey注入到我的资源中。

这在本问题的Java中有涉及。我已经阅读了有关这方面的文档,这些文档也是用Java编写的。最后,GitHub中的一些代码涵盖了相同的主题(通过Dropwizard完成)。

import org.glassfish.hk2.api.Factory
import javax.inject.Inject
import javax.ws.rs.container.ContainerRequestContext
import MyObj

class MyObjFactory @Inject()(ctr: ContainerRequestContext) extends Factory[MyObj] {
  private final val context: ContainerRequestContext = ctr

  override def provide(): MyObj = context.getProperty("myObj").asInstanceOf[MyObj]

  override def dispose(myObj: MyObj): Unit = { }
}
import org.glassfish.hk2.utilities.binding.AbstractBinder

environment.jersey.register(new AbstractBinder {
  override def configure(): Unit = {
    bindFactory(classOf[MyObjFactory])
        .to(classOf[MyObj])
        .proxy(true)
        .proxyForSameScope(false)
        .in(classOf[RequestScoped])
  }
})
@Path("/")
class MyResource {
    @GET
    def get(@Context uriInfo: UriInfo, @Context myObjFactory: MyObjFactory) = {
        // do stuff
    }
}

这将全部编译,但在运行时失败,出现以下异常

ERROR [2017-04-05 00:26:14,605] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 8e5877857c823fef
! java.lang.IllegalArgumentException: Invalid injectee with required type of null passed to getInjecteeDescriptor
! ... 87 common frames omitted
! Causing: org.glassfish.hk2.api.MultiException: A MultiException has 1 exceptions.  They are:
! 1. java.lang.IllegalArgumentException: Invalid injectee with required type of null passed to getInjecteeDescriptor
! 
! at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetInjecteeDescriptor(ServiceLocatorImpl.java:545)
! at org.jvnet.hk2.internal.ServiceLocatorImpl.getInjecteeDescriptor(ServiceLocatorImpl.java:584)
! at org.glassfish.jersey.internal.inject.ContextInjectionResolver$1.compute(ContextInjectionResolver.java:102)
! at org.glassfish.jersey.internal.inject.ContextInjectionResolver$1.compute(ContextInjectionResolver.java:98)
! at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)

我不知道是我在向Scala的转换中犯了错误,还是我在注册绑定器时做了错误的事情。

共有1个答案

祁增
2023-03-14
get(@Context uriInfo: UriInfo, @Context myObjFactory: MyObjFactory) <===

您正在尝试注入工厂工厂用于创建服务。在这种情况下不是要注射的。您要注入的是实际的服务,工厂将用于在幕后创建它

get(@Context uriInfo: UriInfo, @Context myOb: MyObj) <===
 类似资料:
  • 将EntityManager注入资源可以工作,但不能注入Callable。在这里,EntityManager保持。 请告知代码保存在这里是否比保存在GitHub上更好。

  • 问题内容: 我在与dropwizard的合作中是相当新的。目前,我正在尝试实施HK2依赖项注入。在资源内部可以很好地工作,但是在资源外部不能工作。这是我在做什么: 我创建要注入的类的实例并绑定它们。 在我的资源中,注入工作: 所有这些变量都填充有正确类的实例。 问题是:ContentModuleManager还应该通过注入来获取其中一些类: 但是这些都是空的。有人可以解释为什么这个问题会发生,我该

  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 我要的不是意见而是事实 我正在尝试选择一个新的DI。我有一些Guice的经验。总的来说,我想说它的一个优点是,当从scala需要与Java集成时,Guice可以完成这项工作。所以对于互操作性来说,这是一个明显的优势。 如果我们抛开这个互操作性问题不谈,谁能给我简单的比较一下 scaladi,guice,Macwire? 我对了解烫伤症还是新手。我发现令人惊讶的一件事是必须通过隐式参数在喷油器周围移

  • 问题内容: 从头开始,在没有任何Jersey 1.x知识的情况下,我很难理解如何在Jersey 2.0项目中设置依赖项注入。 我也知道HK2在Jersey 2.0中可用,但是我似乎找不到帮助Jersey 2.0集成的文档。 pom.xml 我可以让容器启动并使用我的资源,但是一旦我将@Inject添加到MyService,框架就会引发异常: 问题答案: 你需要定义一个并将其注册到你的JAX-RS应

  • 我正在尝试使用Jersey测试框架为我的REST API编写功能测试。然而,当我在功能测试中使用依赖注入时,我似乎遇到了一个障碍。我的主应用程序看起来是这样的: 是否有一种方法可以将HK2服务定位器与Jersey测试框架一起使用,或者我是否需要将我的应用程序视为外部容器并使用外部容器提供程序,如这里所述:外部容器? 此外,由于这些是功能测试,因此在这里不允许对注入的服务进行嘲弄。