2010-05-31 20 views
7

Java ile web geliştirmede yeni biriyim. Bir web servisi geliştiriyorum ve bunun için REST/Jersey'u seçtim.Jersey/ServletContext ve kaynak yükleme başlangıçta

Hizmetin başlangıcında bazı şeyleri başlatmak ve servisin ömrü boyunca saklamak istiyorum.

İlk soru: Jersey Servlet'in kurucusu bunu yapmak için iyi bir yer mi?

Temel olarak, benim yapmak istediğim, WEB-INF dizinimde bulunan bir config.ini dosyasını yüklemek. Aşağıdaki this help, bir kaynak olarak dosyamı yüklemek için bir ServletContext ihtiyacım var.

Ancak, gerçekten bir sunucu uygulaması örneği değil, bazı ek açıklamalarla bir POJO olmadığı gibi bir Jersey Servlet bu ServletContext nasıl bana açık değildir. this tip'u denemek istedim, ancak "içerik" özniteliği yapıcıda null. Bence bu Jersey yapıcıdan sonra onu doldurabilir. Sağ ?

Peki bunu yapmanın doğru yolu nasıl? Herhangi bir yardım çok takdir

/** Main REST servlet */ 
@Path("/") 
public class Servlet { 

    // ---------------------------------------------------- 
    // Constants      
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini"; 

    // ---------------------------------------------------- 
    // Attributes      
    // ---------------------------------------------------- 

    /** Context */ 
    @Context ServletContext context; 

    // ---------------------------------------------------- 
    // Constructor      
    // ---------------------------------------------------- 

    /** Init the servlet */ 
    public Servlet() { 

     // Load config.ini from WEB-INF 
     Config.config = new Config(
       this.context.getResourceAsStream(CONFIG_PATH)); 

     // FAIL! this.context is null ... 

    } 

    // ---------------------------------------------------- 
    // URI Handlers      
    // ---------------------------------------------------- 

    /** Welcome page */ 
    @GET 
    @Path("/") 
    @Produces(MediaType.TEXT_HTML) 
    public String welcome() { 
     return "<h1>Hi there.</h1>"; 
    } 
} 

:

İşte şimdiye kadar benim kodudur. peşin sayesinde

Raphael

cevap

7

Jersey'deki aşina değilim, ama genellikle bir Java Web uygulamasında, bir ContextListener oluşturmak olacaktır yapmak doğru olanı düşünüyorum.

Bir context listener, javax.servlet.ServletContextListener arabirimini uygulayan ve web.xml dosyasında yapılandırılmış bir sınıftır. Uygulamanın ilk olarak kapınıza yerleştirildiği ve uygulama durdurulduğunda çalıştırılan başka bir yöntemle yürütülen bir yönteme sahiptir; bu nedenle, bir kerelik başlatma olaylarını yerleştirmek ve daha önce temizlik yapmak için ideal bir yer uygulama durduruldu.

Yani adımları şunlardır:

  1. contextInitialized (ServletContextEvent sce) yöntemini uygulamak, sizin Dinleyici sınıf oluşturmak. Bu yöntemde, ServletContext'e erişmenizi sağlayan getServletContext() yöntemine sahip bir ServeltContextEvent öğesi alırsınız.
  2. Burada ek bilgi bulacaksınız

sizin web.xml''deki sizin Dinleyici yapılandırın:

Ya da Sun adlı er, Oracle'ın sitesinde tutorial.

Bu arada, dosyanız bir JAR dosyasında olacaksa, ServletContext yönteminin onu yüklemenin en iyi yolu olduğundan emin değilim.Kiminle birlikte daha iyi olur gibime somethinbg gibi: sanki bir ContextListener kullanılması

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties"); 
+0

Merhaba, yardımlarınız için teşekkürler. Bu, bu şekilde daha net görünüyor ve bu işleri! Bu işe yaramazsa olarak ne yaptığını –

+0

emin değil: öğretici yazılı olarak Jersey, onu ve kod yiyor, bir Jersey Rest servlet altında hiçbir zaman denir. –

8

yılında, "aşağı sonraki katman" ContextListener bu-- yapmak JAX-RS yoludur değil sunucu API'sı. senin gibi, nesnenin sonra üye yapılmış olmasıdır başlatır

public Servlet(@Context ServletContext context) { 

bir veri üyesi için @Context ek açıklaması kullanan:

Sen yapıcı parametrelerinde açıklamalı beyanı koyabilirsiniz ve yapıcı geçilecek keşfetti.

Bunu yapmanın bir başka yolu, yani tembel başlatma init çağrısı çeşit içine Yapılandırma nesnenin başlatma taşımak ve ihtiyaç duyulduğunda sadece bunu başlatmak etmektir. Sonra ServletContext'te veri üyesi zaten Jersey çerçevenin koyduğu olacaktır.

İyi Şanslar!

Kirk

+0

Sen durumda sınıfın bir özelliği olarak birden yöntemler ... Otomatik olarak enjekte edilir aynı almak gerektiğini ilan edebilir ve bu daha kolaydır. Kurucuya iletmeye gerek yok! –

İlgili konular