2016-09-13 6 views
8

I created a project Resteasy를 사용하여 Jax-rs 리소스에서 Google Guice가 제공하는 의존성 삽입을 테스트합니다.Resteasy와 Google Guice : @Injection으로 여러 개의 @ApplicationPath 및 리소스를 사용하는 방법?

내 의도는 다음과 같습니다 내 API의 버전

  • 를 사용하여 여러 @ApplicationPath. @ApplicationPath으로 주석 된 각 클래스에서 특정 버전에 대한 클래스 집합을로드합니다.
  • 각 리소스에는 일부 서비스를 주입하기 위해 생성자에 Google Guice의 @Inject이 있습니다. ApplicationV1RSApplicationV2RS :

나는 @ApplicationPath 주석이 개 클래스를 만들었습니다. 둘 모두에서 동일한 테스트를 위해서만 동일한 리소스 클래스 (UserResourceHelloResource)를 추가했습니다.

내 모듈은 다음과 같이 구성되어 있습니다 :

public class HelloModule implements Module 
{ 
    public void configure(final Binder binder) 
    { 
     binder.bind(IGreeterService.class).to(GreeterService.class); 

     binder.bind(IUserService.class).to(UserService.class); 
    } 
} 

내가 http://localhost:9095/v1/hello/world 또는 http://localhost:9095/v2/hello/world 전화

, 나는 같은 오류가 나타납니다

java.lang.RuntimeException: RESTEASY003190: Could not find constructor 
    for class: org.jboss.resteasy.examples.guice.hello.HelloResource 

글쎄, 내가 예상대로이없는 작품. Google Guice는 나를 위해 construtor를 사용하여 리소스 클래스를 인스턴스화하는 "똑똑한"것은 아닙니다.

그러나 나는 일할 길을 찾을 수 없습니다. 정말로 솔직히 말해서, 나는이 시나리오에서 Google Guice, Jetty 및 Resteasy가 서로 어떻게 연동하는지 혼란 스럽다. 내가 사용 @ApplicationPath의 아이디어를 포기하는 경우

, 내 자원이 구글 Guice 이런 내 HelloModule을 구성하는 작업 :

public class HelloModule implements Module 
{ 
    public void configure(final Binder binder) 
    { 
     binder.bind(HelloResource.class); 
     binder.bind(IGreeterService.class).to(GreeterService.class); 

     binder.bind(UserResource.class); 
     binder.bind(IUserService.class).to(UserService.class); 
    } 
} 

그러나이 경우

, 나는 ( HelloResource 내 자원을 등록 할 컨트롤을 통과하고있어 UserResource)를 Guice에게 보냅니다. 유연하지 않아 복수형을 설정할 수 없습니다 @ApplicationPath.

그럼 내가 이해하지 못하거나 이해하지 못하는 것은 무엇입니까?

문제 코드로 프로젝트를 만들었습니다. 설정 및 테스트가 매우 쉽습니다. https://github.com/dherik/resteasy-guice-hello/tree/so-question/README.md

감사합니다.

답변

1

응용 프로그램에 getClasses 메소드가 있으면 자원 클래스에없는 기본 생성자를 사용하여 등록 된 모든 자원에 대한 인스턴스를 작성하려고 시도합니다. 한 가지 방법은 기본 생성자를 만들고 setter 삽입을 통해 종속성을 주입하는 것입니다. 그리고 getClassesApplicationV1RSApplicationV2RS으로 대체하는 대신 getSingletons을 무시하십시오. 리소스는 싱글 톤이 될 수 있기 때문에.

다음은 내가 원하는대로 작동하도록 변경 한 내용입니다.

HelloResource.java

@Path("hello") 
public class HelloResource { 
    @Inject 
    private IGreeterService greeter; 

    public HelloResource() { 
    } 

    @GET 
    @Path("{name}") 
    public String hello(@PathParam("name") final String name) { 
     return greeter.greet(name); 
    } 
} 

UserResource.java

@Path("user") 
public class UserResource { 

    @Inject 
    private IUserService userService; 

    public UserResource() { 
    } 

    @GET 
    @Path("{name}") 
    public String hello(@PathParam("name") final String name) { 
     return userService.getUser(name); 
    } 
} 

귀하의 서비스 클래스에 @Singleton 추가

@ApplicationPath("v2") 
public class ApplicationV2RS extends Application { 

    private Set<Object> singletons = new HashSet<Object>(); 

    public ApplicationV2RS(@Context ServletContext servletContext) { 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     Injector injector = Guice.createInjector(new HelloModule()); 

     HelloResource helloResource = injector.getInstance(HelloResource.class); 
     UserResource userResource = injector.getInstance(UserResource.class); 
     singletons.add(helloResource); 
     singletons.add(userResource); 
     return singletons; 
    } 
} 
@ApplicationPath("v1") 
public class ApplicationV1RS extends Application { 

    private Set<Object> singletons = new HashSet<Object>(); 

    public ApplicationV1RS(@Context ServletContext servletContext) { 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     Injector injector = Guice.createInjector(new HelloModule()); 

     HelloResource helloResource = injector.getInstance(HelloResource.class); 
     UserResource userResource = injector.getInstance(UserResource.class); 
     singletons.add(helloResource); 
     singletons.add(userResource); 
     return singletons; 
    } 
} 

ApplicationV2RS.java

ApplicationV1RS.java

.

희망이 있습니다.

또한 코드를 forked repo으로 푸시했습니다. 그것을 확인하십시오

+0

그리고 web.xml 여전히 필요하지 않니? 내가 맞습니까? – SayusiAndo