2013-08-16 28 views
11

Chúng tôi đang di chuyển một số dịch vụ dữ liệu của chúng tôi từ Jersey 1.x sử dụng jersey-spring đến Jersey 2.x sử dụng jersey-spring3.Chỉ định bối cảnh ứng dụng tùy chỉnh

Chúng tôi có một vài lớp thử nghiệm kế thừa từ JerseyTest. Một số các lớp này sử dụng các tệp customContext.xml tùy chỉnh không được chỉ định trong tệp web.xml.

Trong Jersey 1.x các lớp thử nghiệm mở rộng JerseyTest có thể gọi hàm tạo siêu với một WebappDescriptor.Builder để tham số ngữ cảnh có thể được chuyển tới thiết lập hoặc ghi đè đường dẫn ngữ cảnh ứng dụng.

Ví dụ:

public MyTestClassThatExtendsJerseyTest() 
{ 
    super(new WebAppDescriptor.Builder("com.helloworld") 
    .contextParam("contextConfigLocation", "classpath:helloContext.xml") 
    .servletClass(SpringServlet.class) 
    .contextListenerClass(ContextLoaderListener.class) 
    .requestListenerClass(RequestContextListener.class).build()); 
} 

Làm thế nào có thể đạt được với Jersey 2.x?

Tôi đã chải kỹ qua API docs, user guides và một số trong số sources nhưng không thể tìm thấy câu trả lời.

Cảm ơn bạn.

Trả lời

7

Cho phép giả định Application trông bạn như:

@ApplicationPath("/") 
public class MyApplication extends ResourceConfig { 

    /** 
    * Register JAX-RS application components. 
    */ 
    public MyApplication() { 
     // Register RequestContextFilter from Spring integration module. 
     register(RequestContextFilter.class); 

     // Register JAX-RS root resource. 
     register(JerseySpringResource.class); 
    } 
} 

JAX-RS nguồn gốc của bạn như:

@Path("spring-hello") 
public class JerseySpringResource { 

    @Autowired 
    private GreetingService greetingService; 

    @Inject 
    private DateTimeService timeService; 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getHello() { 
     return String.format("%s: %s", timeService.getDateTime(), greetingService.greet("World")); 
    } 
} 

Và bạn phải mô tả mùa xuân mang tên helloContext.xml sẵn trực tiếp từ đẳng cấp con đường của bạn. Bây giờ bạn muốn kiểm tra phương thức tài nguyên getHello của bạn bằng cách sử dụng Khung kiểm tra Jersey. Bạn có thể viết bài kiểm tra của bạn như:

public class JerseySpringResourceTest extends JerseyTest { 

    @Override 
    protected Application configure() { 
     // Enable logging. 
     enable(TestProperties.LOG_TRAFFIC); 
     enable(TestProperties.DUMP_ENTITY); 

     // Create an instance of MyApplication ... 
     return new MyApplication() 
       // ... and pass "contextConfigLocation" property to Spring integration. 
       .property("contextConfigLocation", "classpath:helloContext.xml"); 
    } 

    @Test 
    public void testJerseyResource() { 
     // Make a better test method than simply outputting the result. 
     System.out.println(target("spring-hello").request().get(String.class)); 
    } 
} 
+0

tôi phát hiện 'cái phương pháp property' trong API tài liệu nhưng không rõ ràng với tôi rằng phương pháp này có thể được áp dụng cho các tham số ngữ cảnh. Tôi đã cập nhật mã của tôi theo ví dụ rất thông tin của bạn. Từ các bản ghi đầu ra của tôi và kiểm tra, nó xuất hiện rằng tệp ngữ cảnh ứng dụng chính xác hiện đang được gọi. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn. Tôi có thêm một câu hỏi ngay bây giờ về cách lấy các cá thể bean từ cấu hình đang chạy. Tôi có nên tạo một câu hỏi mới không? –

+0

Vâng, nếu câu hỏi này được trả lời thì có, hãy tạo một câu hỏi mới. Cám ơn. –

+0

Cảm ơn bạn. Tôi đã đăng một câu hỏi tiếp theo. [Lấy một bean được quản lý từ một thùng chứa JerseyTest với jersey-spring3] (http://stackoverflow.com/questions/18282409/retrieve-a-managed-bean-from-a-jerseytest-container-with-jersey-spring3). Tôi liên kết nó ở đây vì nó có thể mang lại lợi ích cho những người đọc câu trả lời này. –

8

này không làm việc cho tôi như tôi đã không sử dụng cấu hình theo phong cách .xml, tôi đã sử dụng @Configuration chú thích. Vì vậy, tôi phải trực tiếp cung cấp ngữ cảnh ứng dụng cho lớp ResourceConfig.

tôi xác định các phương pháp cấu hình trong JerseyTest tôi như vậy:

@Override 
protected Application configure() { 
    ResourceConfig rc = new ResourceConfig(); 

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); 
    rc.property("contextConfig", ctx); 
} 

nơi SpringConfig.class là lớp học của tôi với @Configuration chú thích và nhập khẩu org.springframework.context.annotation.AnnotationConfigApplicationContext

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