【问题标题】:Dropwizard/Jersey/HK2 Dependency Injection in ScalaScala 中的 Dropwizard/Jersey/HK2 依赖注入
【发布时间】:2017-04-05 01:11:05
【问题描述】:

尝试创建自定义 @Context 我可以通过 Jersey 注入我的资源。

this question 中的 Java 对此进行了介绍。 我读过docs covering this 也是Java 的。 最后是一些覆盖相同topic (doing this all through Dropwizard) in Github 的代码。

第一部分是创建工厂。

斯卡拉:

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 = { }
}

下一部分是注册工厂,我假设classOf[T] 是适当的Scala,相当于Java 的T.class

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 时犯了错误,还是在注册 Binder 时做错了什么。

【问题讨论】:

    标签: scala dependency-injection jersey dropwizard hk2


    【解决方案1】:
    get(@Context uriInfo: UriInfo, @Context myObjFactory: MyObjFactory) <===
    

    您正在尝试注入 FactoryFactory 用于创建服务。在这种情况下,它并不意味着被注入。您要注入的是实际的服务,工厂将用于在后台创建它

    get(@Context uriInfo: UriInfo, @Context myOb: MyObj) <===
    

    【讨论】:

    • 良好的通话,虽然仍然因运行时错误而失败 - 我已更新以反映您的建议。
    • 实际上,我刚刚删除了 .proxy(true).proxyForSameScope(false 方法,一切正常。不确定这些是否重要,但我感谢您的帮助!
    • 很高兴你能成功。仅供参考,请不要像那样对您的帖子进行编辑。您所做的只是使我的回答无效。如果您想在帖子中添加新内容,那么就这样做,添加它,不要替换以前的内容。只需在底部放一点“编辑”,然后在其下方添加新内容
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多