2015-02-02 6 views
3

저는 HK2 주입을 사용하여 작업중인 저지/부두 설치를 해킹 할 수 있었지만, 다소 혼란스럽고 (때로는 일치하지 않는) 문서가 많아서, 제가 찾았는지 확실하지 않습니다. 그것을 얻는 것의 약간의 현저한 세부 사항을 놓쳤다. .. 서 있기 때문에, 나는 이처럼 서블릿을 부트 스트랩하고있다;Jersey 2 (부두가있는)를 부트 스트랩하는 올바른 방법은 무엇입니까?

 // Jersey 
     ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
     ServletContainer jerseyServletContainer = new ServletContainer(new AppResourceConfig()); 
     ServletHolder jerseyServletHolder = new ServletHolder(jerseyServletContainer); 
     servletContextHandler.setContextPath("/"); 
     servletContextHandler.addServlet(jerseyServletHolder, "/api/*"); 

     // Wire up Jetty 
     HandlerCollection handlerList = new HandlerCollection(); 
     handlerList.setHandlers(new Handler[]{ servletContextHandler }); 
     Server server = new Server(configuration.getInt("Server.Port")); 
     server.setHandler(handlerList); 
     server.start(); 
     server.join(); 

나는 내 AppResourceConfig를 다음과 같이 정의합니다.

public class AppResourceConfig extends ResourceConfig { 
    public AppResourceConfig() { 
     register(new AppBinder()); 
     packages("org.sandbox.resources"); 
    } 
} 

그리고 내 AppBinder는 다음과 같습니다.

public class AppBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     bind(new StringService()).to(StringService.class); 
    } 
} 

이 모든 것이 간단한 테스트 케이스에서 작동하지만 몇 가지 사항은 분명하지 않습니다. Jersey 문서는 확장해야하는 Application 클래스를 참조하고 Injections.addBinding을 사용하여 바인딩을 설정합니다. 그러나이를 위해 어떻게 든 @Inject를 사용하여 ServiceLocator 인스턴스를 생성자에 가져옵니다. 그리고 그들은 전혀 바인더를 만들지 않는 것처럼 보입니다. (https://jersey.java.net/documentation/latest/migration.html-26.14.1.1. 사용자 정의 객체 삽입).

누군가 내 접근 방식이 올바른지 여부를 알려주고 Application과 ResourceConfig의 차이점을 알려주고 실제로 프레임 워크가 의도 한 것과 일관성을 유지하기 위해해야 ​​할 일은 무엇입니까?

답변

3

Application은 Java EE 사양에 정의 된 REST API 인 JAX-RS의 일부입니다. Jersey는 해당 API의 구현 중 하나입니다. 따라서 표준 Application을 사용하여 JAX-RS에서 정의한대로 Jersey를 사용하여 REST 응용 프로그램을 설정할 수 있습니다. ResourceConfigApplication까지 확장되며 Jersey의 구현에 따라 구현이 향상됩니다. 코드 에서처럼 주사를 추가하거나 스캔 할 패키지를 추가하는 등의 쉬운 설정이 가능합니다.

링크 된 문서는 바인더를 사용합니다. 예전의 Jersey 1.x를 언급하지 않은 예제들. 다른 예제에서는 org.glassfish.jersey.internal.inject.Injections 클래스 (패키지 이름에서 알 수 있듯이) 클래스를 사용하면 안된다고 생각합니다. 왜 그들이 문서에 포함 시켰는지 모르겠다. 거기에 있지 않아야한다고 생각한다. 어쩌면 한 번 공개 API의 일부 또는 예를 들어 무엇을 할 다른 방법이 없습니다. 어쨌든, 그 수업을 사용하지 않는 것이 좋습니다.

당신의 접근 방식은 괜찮아 보입니다. 순수한 JAX-RS로 제한하지 않고 Jersey API의 기능을 사용하면 RestEasy 나 Apache CFX와 같은 다른 JAX-RS 프레임 워크 만 제공하는 경우 컨테이너 환경에서 앱을 실행하는 것이 더 어려워 질 수 있습니다. 다른 프레임 워크를 지원하지 않으려는 경우 Jersey의 장점을 활용하는 것이 좋습니다.

+0

호기심에서 벗어나 순수한 JAX-RS 접근 방식은 어떻게 생겼을까요? 응용 프로그램 용 ResourceConfig를 바꿀 수 있습니까? – XeroxDucati

+0

@XeroxDucati 그렇습니다. Jersey 또는 다른 프레임 워크가 아닌 JAX-RS API 만 가져올 수도 있습니다. Pure JAX-RS는 더 제한적이기 때문에 저지가 제공하는 기능에 대한 대체 솔루션을 찾아야합니다. ResourceConfig에서 구성하는 대신 web.xml을 사용하거나 표준에서 정의 된 다른 구성 방법을 사용해야합니다. – Kapep