3

주입하려는 매개 변수가있는 생성자가있는 공개 할 리소스가 있습니다. 그러나 나는 어떤 사출 프레임 워크도 사용하지 않고 있으며, Jetty가 임베디드되어 있습니다. 이와 자원에 대한 현재 내장 된 Jetty를 사용하여 리소스에 매개 변수 전달

부두 스캔 :

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 

하지만 생성자에서 아무것도 주입에서 저를 방지, 그래서 기본 생성자를 사용해야합니다.

내 리소스 생성자에 전달할 자체 인스턴스를 지정하고 싶습니다. 수동으로 리소스를 인스턴스화하고이를 서블릿 컨테이너에 추가하는 방법이 있습니까? 그런

MyRestResource resource = new MyRestResource(param1, param2); 
servletContextHandler.addServlet(resource); 

또는 무언가 :

이 같은 것을 할 수 있습니까?

+1

귀하의 질문 제목 및 질문의 내용이 다른 것을위한 것입니다. 제목은 서블릿에 정보를 전달하는 방법을 묻습니다. 콘텐츠가 MyRestResource를 서블릿처럼 동작하게 만드는 방법을 묻는 동안. –

답변

3

MyRestResourceServlet 인 경우 existing servlet holder constructor을 사용할 수 있습니다.

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 
MyRestResource resource = new MyRestResource(param1, param2); 
// wrap resource in a ServletHolder 
ServletHolder resourceHolder = new ServletHolder(resource); 
// assign resource to a Servlet pathSpec 
servletContextHandler.addServlet(resourceHolder, "/rest"); 

당신이 서블릿을 가지고 있고, 시작 시간에 뭔가 설정에 액세스하려면

ContextHandler.setAttribute(String, Object)ServletContext.getAttribute(String) 기술을 사용합니다. 서버 시작

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 
MyRestResource resource = new MyRestResource(param1, param2); 
// Set resource as a context attribute 
servletContextHandler.setAttribute("rest-1", resource); 

에서

그런 다음 액세스 당신은 사용자 정의 ResourceConfig와 (뉴저지) ServletContainer를 등록하여 저지 자원에 대한 의존성을 삽입 할 수 나중에

ServletContext ctx = servletRequest.getServletContext(); 
MyRestResource resource = (MyRestResource) ctx.getAttribute("rest-1"); 
+0

MyRestResource가 Servlet을 확장하지 않으면 어떻게됩니까? MyRestResource 클래스보다 "@Path", "@Produces", "@Consumes"등과 같은 Jersey 주석 (또는 javax 주석) 만 사용하고 있습니다. Servlet을 확장하는 것이 논리적일까요? – Pacane

+0

Servlet을 확장하지 않으면 Jersey에서 관리해야합니다. 그런 종류의 객체로 Jetty의 ServletContextHandler를 사용하는 것은 불가능합니다. 이 시점에서 Jersey와 메커니즘을 사용하는 데 집중해야합니다. –

+0

Jetty 8이 EOL (생명의 끝)이기 때문에'stable-8'을'stable-9'로 바꾸면 최신 문서를 볼 수 있기 때문에 제공된 링크가 죽은 – rpax

7

서블릿 API에서입니다. 생성자를 통해 시계에 삽입 된 TimeResource 클래스를 만드는 예제로 아래 코드를 살펴보십시오.

public void start() { 
    server = new Server(6666); 
    ServletContextHandler handler = new ServletContextHandler(); 
    handler.setContextPath(""); 
    // adds Jersey Servlet with a customized ResourceConfig 
    handler.addServlet(new ServletHolder(new ServletContainer(resourceConfig())), "/*"); 
    server.setHandler(handler); 
    try { 
     server.start(); 
    } catch (Exception e) { 
     throw new RuntimeException("Could not start the server", e); 
    } 
} 

private ResourceConfig resourceConfig() { 
    // manually injecting dependencies (clock) to Jersey resource classes 
    return new ResourceConfig().register(new TimeResource(clock)); 
} 

소스 코드 전체 예에서 볼 수 있습니다 :

http://unclejamal.github.io/2013/09/18/manual-dependency-injection-with-jersey-and-embedded-jetty.html

+0

감사합니다. 정확하게 필요한 것입니다. – endian