2017-04-05 1 views
1

カスタムを作成しようとしています@Context私はJersey経由で私のリソースに注入できます。ScalaのDropwizard/Jersey/HK2依存性注入

これはJavaでthis questionに記載されています。 私は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]は、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]) 
    } 
}) 

最終実噴射する必要がありますへの適切なScalaのと同等であるという仮定を作る工場を、登録されています。

@Path("/") 
class MyResource { 
    @GET 
    def get(@Context uriInfo: UriInfo, @Context myObjFactory: MyObjFactory) = { 
     // do stuff 
    } 
} 

このすべてのcom山私はスカラ座に私の変換で間違いを犯していますか私は実際にバインダーを登録何か間違ったことをやった場合

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) 

が言うことができない、次の例外を除いて、実行時に失敗します。

答えて

2
get(@Context uriInfo: UriInfo, @Context myObjFactory: MyObjFactory) <=== 

Factoryを注入しようとしています。 Factoryに、サービスを作成するために使用されています。これは、この場合に注入されることを意味していません。あなたが注入したいのは実際のサービスです。工場はその場でそれを作成するために使用されます。

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

良い呼び出しですが、それでも実行時エラーで失敗しました。私はあなたの推薦を反映するように更新しました。 – diplosaurus

+0

実際に私は '.proxy(true)'と '.proxyForSameScope(false')メソッドを削除してすべての作業を終えましたが、それらが重要なのかどうかは分かりませんが、助けてくれてありがとうございます! – diplosaurus

+1

うれしいことです。あなたの投稿に新しいコンテンツを追加したいのであれば、それを追加して、それを追加して、以前のコンテンツを置き換えないでください。ちょっとした "下に新しいコンテンツを追加してください。 –