2009-11-29 25 views
56

Tôi đang phát xung quanh với JAX-RS, triển khai trên Tomcat. Về cơ bản, đó là:Nhận ServletContext trong tài nguyên JAX-RS

@Path("/hello") 
@Produces({"text/plain"}) 
public class Hellohandler { 

    @GET 
    public String hello() { 
     return "Hello World"; 
    } 

} 

Có cách nào để giữ tài khoản JAX-RS của tôi không?

Trả lời

87

Hơn nữa, @Resource chú thích không thể làm việc. Hãy thử điều này

@javax.ws.rs.core.Context 
ServletContext context; 

Việc tiêm không xảy ra cho đến khi bạn nhấn phương pháp dịch vụ

public class MyService { 
    @Context ServletContext context; 

    public MyService() { 
     print("Constructor " + context); // null here  
    } 

    @GET 
    @Path("/thing") {    
      print("in wizard service " + context); // available here 
+0

lớp javax.ws.rs nào tôi sử dụng làm bộ xử lý servlet? – leeeroy

+0

Không thực sự nhận được bạn bởi điều này. Bạn đã có một lớp xử lý các yêu cầu HTTP GET. Xin hãy giải thích thêm về Servlet Handler. Chúc mừng. –

+0

Một thùng chứa servlet cần một servlet để xử lý các yêu cầu. com.sun.ws.rest.spi.container.servlet.ServletContainer xử lý các yêu cầu và gửi chúng đến các lớp chú thích của tôi. Bạn ngụ ý tôi không nên sử dụng com.sun. * Lớp học, vì vậy những gì sau đó tôi nên sử dụng? – leeeroy

5

Chỉ cần sử dụng tiêm tài nguyên như thế này,

@Resource ServletContext servletContext; 
5

Như những người khác đã lưu ý, các ServletContext có thể được tiêm vào lĩnh vực này cấp độ. Nó cũng có thể được tiêm ở cấp phương thức:

public static class MyService { 
    private ServletContext context; 
    private int minFoo; 

    public MyService() { 
     System.out.println("Constructor " + context); // null here 
    } 

    @Context 
    public void setServletContext(ServletContext context) { 
     System.out.println("servlet context set here"); 
     this.context = context; 

     minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue(); 

    } 

    @GET 
    @Path("/thing") 
    public void foo() { 
     System.out.println("in wizard service " + context); // available here 
     System.out.println("minFoo " + minFoo); 
    } 
} 

Điều này sẽ cho phép bạn thực hiện khởi tạo bổ sung với servletContext có sẵn.

Lưu ý rõ ràng - bạn không phải sử dụng tên phương thức setServletContext. Bạn có thể sử dụng bất kỳ tên phương thức nào bạn muốn miễn là bạn làm theo mẫu đặt tên đậu java chuẩn cho các bộ định vị, void setXXX (Foo foo) và sử dụng chú thích @Context.

+0

không nên được đặtServletContext (@Context ServletContext context) – Thomas

6

Ngữ cảnh servlet cũng khả dụng khi bạn triển khai ServletContextListener. Điều này giúp dễ dàng tải các tham số như chuỗi kết nối khi khởi động. Bạn có thể định nghĩa lớp người nghe trong tệp tin web.xml tải bạn ServletContextListener khi khởi động ứng dụng web của bạn.

Bên trong tệp web.xml, thêm các thẻ <listener><context-param>. <listener> chỉ định lớp được gọi khi khởi động. Thẻ <context-param> xác định tham số ngữ cảnh có sẵn trong ứng dụng web của bạn.

Thứ nhất, bao gồm các <listener><context-param> thẻ trong file web.xml:

<web-app> 
    <!-- ... --> 
    <listener> 
    <listener-class>com.your.package.ServletContextClass</listener-class> 
    </listener> 

    <!-- Init parameters for db connection --> 
    <context-param> 
    <param-name>your_param</param-name> 
    <param-value>your_param_value</param-value> 
    </context-param> 
    <!-- ... --> 
</web-app> 

Bây giờ, tạo lớp servlet context như sau.

public class ServletContextClass implements ServletContextListener 
{ 
    public void contextInitialized(ServletContextEvent arg0) 
    { 
    //use the ServletContextEvent argument to access the 
    //parameter from the context-param 
    String my_param = arg0.getServletContext().getInitParameter("your_param"); 
    }//end contextInitialized method 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) 
    { }//end constextDestroyed method 
} 

Bây giờ bạn có thể chọn biến tĩnh nào để gán thông số bạn đã đọc. Điều này cho phép bạn đọc tham số một lần khi khởi động và sử dụng lại nhiều lần thông qua biến tĩnh mà bạn gán nó.

+0

Cũng có thể đặt 'context-param's trong' conf/context.xml' trong Apache Tomcat: http://stackoverflow.com/a/1626190/ 2639234 – KeksArmee

Các vấn đề liên quan