2011-07-13 23 views
5

我正在嘗試將服務注入到正在使用Jersey的Rest類中。澤西島和彈簧集成 - 在運行時注入bean爲空

無論我嘗試向該類中注入什麼或如何注入,似乎都會在運行時顯示爲null。查看日誌文件顯示,當Web應用程序初始化時setJsonTestService被調用,並且此時它不爲null。但是,稍後通過對此類的PUT請求訪問它時,它將爲空。

我完全感到困惑。

類看起來是這樣的:

@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..."); 
     } 
    } 
} 

任何想法?

更新:

的web.xml(新澤西州)

<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

Web請求如何映射到這個Jersey類?聽起來像Spring實例化這個類的一個實例,但是Jersey實例化另一個實例來處理請求。 –

+0

我已經更新了問題以顯示我的web.xml的Jersey部分。那是我提到澤西島的唯一其他地方。 – zclark

+0

並解決。 Maven和我的Jersey導入導致問題導致2.5.6和3.0.5的spring-context被導入。這導致註釋衝突並導致同一類的不同實例化。將它作爲一個答案,一旦它讓我...感謝您的見解馬特。 – zclark

回答

4

嘗試

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

您還需要contextConfigLocation<context-param>,但我以爲你擁有了它。 See here關於設置的更多細節

由於matt b建議spring實例化您的對象,但Jersey不知道有關spring的任何內容並再次實例化它們自身。當您使用SpringServlet時,它應該找到彈簧應用程序上下文。

也就是說,spring-mvc提供了對RESTful服務的支持,這與JAX-RS非常相似。你也可以嘗試一下。

+0

是的,我正在玩這個,並最終在使用它時得到它的工作。如果沒有適當的Maven排除,它不會讓我失望。 – zclark