2011-07-13 13 views
5

Jersey kullanarak bir Rest sınıfına hizmetler enjekte etmeye çalışıyorum.Jersey ve yaylı entegrasyon - fasulye Enjeksiyonlar çalışma zamanında boştur

Bu sınıfa ne şekilde veya nasıl enjekte etmeye çalıştığım önemli değil, çalışma zamanında null olarak görünüyor. Günlük dosyalarına bakmak, web uygulaması başlatıldığında setJsonTestService'nin çağrıldığını ve bu noktada null olmadığını gösterir. Ancak, daha sonra bu sınıf için bir PUT isteği ile eriştiğinizde, boştur.

Tamamen şaşırdım.

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

Herhangi fikirler:

sınıf şöyle?

Güncelleme:

<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 istekleri bu Jersey sınıfıyla nasıl eşleştirilir? Spring gibi sesler bu sınıfın bir örneğini başlatır, ancak Jersey istekleri ele almak için başka bir örneği başlatır. –

+0

Web.xml sayfamın Jersey bölümünü göstermek için bu soruyu güncelledim. Jersey'den bahsettiğim tek yer burası. – zclark

+0

Ve çözüldü. Maven ve benim Jersey ithalatı ile ilgili sorun hem ilkbahar-bağlama 2.5.6 ve hem de 3.0.5'in ithal edilmesine neden oldu. Bu, ek açıklama çatışmasına neden oldu ve aynı sınıfın farklı örneklemelerine yol açtı. Bana izin verdikten sonra cevap olarak gönderir ... İçgörü Matt için teşekkürler. – zclark

cevap

4

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

deneyin

web.xml (Jersey) Ayrıca contextConfigLocation<context-param> gerekir, ama ona sahip varsayalım. See here Kurma hakkında daha ayrıntılı bilgi için

Mat b önerdiğiniz ilkbahar nesnelerinizi başlatır, ancak Jersey ilkbahar hakkında hiçbir şey bilmez ve bunları yeniden oluşturur. SpringServlet'u kullandığınızda, yay uygulama bağlamını bulmalıdır.

Bu, ilkbahar-mvc, JAX-RS'inkine benzer RESTful hizmetleri için destek sağlar. Sen de deneyebilirsin.

+0

Evet, bununla uğraştım ve işe geldiğinde bunu kullanarak sona erdi. Sadece uygun Maven hariç tutmama izin vermezdi. – zclark

İlgili konular