2011-07-13 19 views
5

Tôi đang cố gắng tiêm dịch vụ vào lớp Rest đang sử dụng Jersey.Tích hợp Jersey và spring - bean Injections là null khi chạy

Không có vấn đề gì hoặc làm thế nào tôi cố gắng để tiêm vào lớp này dường như được hiển thị như là null khi chạy. Nhìn vào các tệp log cho thấy setJsonTestService đang được gọi khi ứng dụng web được khởi tạo và nó không phải là null vào thời điểm này. Nhưng, khi truy cập nó sau đó với một yêu cầu PUT cho lớp này, nó là null.

Tôi hoàn toàn bối rối.

Lớp trông như thế này:

@Named 
@Path("JsonTest") 
public class JsonTest { 
    @Context 
    Request request; 
    @Context 
    UriInfo uriInfo; 

    protected final Logger log = Logger.getLogger(getClass()); 

    private JsonTestService jsonTestService; 

    @Autowired 
    public void setJsonTestSerivce(JsonTestService jsonTestService) { 
     log.info("Setting JsonTestService."); 
     if (jsonTestService == null) { 
      log.info("JsonTestService is null at injection"); 
     } 
     this.jsonTestService = jsonTestService; 
    } 

    @Inject 
    public ScrapIntermediate scrapIntermediate; // just a plain empty class with an is true method 

    @PUT 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public void putJson(@PathParam("id") String id) { 
     log.info("Putting some json at " + id); 
     if (scrapIntermediate == null) { 
      log.info("scrapIntermediate is null..."); 
     } 
     if (jsonTestService != null) { 
      jsonTestService.sendUpdate(); 
     } else { 
      log.info("jsonTestService is null..."); 
     } 
    } 
} 

Bất kỳ ý tưởng?

Cập nhật:

web.xml (Jersey)

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>EDAS</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
+2

Các yêu cầu web được ánh xạ tới lớp Jersey này như thế nào? Âm thanh như Spring khởi tạo một thể hiện của lớp này, nhưng Jersey tạo ra một thể hiện khác để sử dụng trong việc xử lý các yêu cầu. –

+0

Tôi đã cập nhật câu hỏi để hiển thị phần Jersey của tệp web.xml của tôi. Đó là nơi duy nhất tôi đề cập đến Jersey. – zclark

+0

Và đã được giải quyết. Vấn đề nằm với Maven và nhập khẩu Jersey của tôi khiến cả hai bối cảnh mùa xuân 2.5.6 và 3.0.5 được nhập khẩu. Điều này gây ra xung đột chú thích và dẫn đến các instantiations khác nhau của cùng một lớp. Sẽ đăng nó như là một câu trả lời một khi nó cho phép tôi ... Cảm ơn bạn cho sự hiểu biết Matt. – zclark

Trả lời

4

Hãy thử

<servlet-class> 
    com.sun.jersey.spi.spring.container.servlet.SpringServlet 
</servlet-class> 

Bạn cũng sẽ cần contextConfigLocation<context-param>, nhưng tôi giả sử bạn có nó. See here để biết thêm chi tiết về việc thiết lập

Vì mùa xuân được đề xuất cho các đối tượng của bạn, nhưng Jersey không biết gì về mùa xuân và tự khởi tạo lại chúng. Khi bạn sử dụng các SpringServlet nó nên xác định bối cảnh ứng dụng mùa xuân.

Điều đó nói rằng, spring-mvc cung cấp hỗ trợ cho các dịch vụ RESTful rất giống với dịch vụ JAX-RS. Bạn cũng có thể thử nó.

+0

Vâng, tôi đã chơi đùa với điều này và kết thúc bằng cách sử dụng điều này khi làm cho nó hoạt động. Nó sẽ không cho tôi mà không có sự loại trừ Maven thích hợp. – zclark

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