2017-04-05 5 views
1

맞춤 작성 시도 @Context 저지를 통해 내 자료에 삽입 할 수 있습니다.스칼라의 Dropwizard/Jersey/HK2 의존성 주입

이 내용은 this question에서 Java로 다룹니다. 나는 자바에있는 docs covering this을 읽었습니다. 마지막으로 동일한 코드를 다루는 일부 코드 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]가에 대한 적절한 스칼라 상응하는 것을 가정을 만드는 공장을 등록하는 자바의 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) 

는 말할 수 없다 다음과 같은 예외로 런타임에 실패합니다.

답변

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

다행 이군요. 참고하시기 바랍니다. 당신이 한 일은 내 대답을 무효로합니다. 당신의 게시물에 새로운 콘텐츠를 추가하고 싶다면, 그냥 그걸 추가하고, 그것을 추가하고, 이전 콘텐츠를 다시 배치하지 마십시오. 그냥 " 편집 "을 클릭 한 다음 아래에 새 콘텐트를 추가하십시오. –