2013-05-12 29 views
6

'da nasıl yüklerim ve depolarım Eski bir satıcı API'sini saran bir RESTful Web Hizmeti oluşturuyorum. Bazı harici yapılandırma gerekli olacaktır ve sunucuda bir dosyada veya rdbms'de saklanacaktır. Glassfish 3.1.2'de Jersey 1.11.1 kullanıyorum. Bu yapılandırma verisinin tümü Dize anahtar/değer biçimindedir.Küresel değişkenleri Jersey/Glassfish

İlk sorum şu: Bu, global/örnek değişkenlerini Jersey'de nerede saklayabilir, böylece isteklerin arasında kalır ve tüm kaynaklar kullanılabilir olur? Bu saf bir Servlet uygulaması olsaydı, bunu gerçekleştirmek için ServletContext'i kullanırdım.

Sorunun ikinci kısmı, Jersey sunucusunun yüklendikten sonra yapılandırmamı nasıl yükleyebilirim? Yine, benim Servlet benzetimi init() yöntemine eşdeğer bulmak olacaktır.

cevap

11

@Singleton @Startup EJB gereksinimlerinize uygundur.

@Singleton 
@Startup // initialize at deployment time instead of first invocation 
public class VendorConfiguration { 

    @PostConstruct 
    void loadConfiguration() { 
     // do the startup initialization here 
    } 

    @Lock(LockType.READ) // To allow multiple threads to invoke this method 
         // simultaneusly 
    public String getValue(String key) { 
    } 
} 


@Path('/resource') 
@Stateless 
public class TheResource { 
    @EJB 
    VendorConfiguration configuration; 
    // ... 
} 

DÜZENLEME: Graham'ın comment göre Eklendi açıklama

+0

Bu harika bir çözüm gibi görünüyor ve yükleme zamanında düzgün çalışıyor, ancak bu EJB'yi Kaynak sınıflarımda kullanmaya çalıştığımda bir InvocationTargetException (kapsayıcı tarafından NullPointerException olarak görüntülenir) alıyorum. – Graham

+0

Jersey postalama listesinden: _Ey kaynaklarının yönetilen bir fasülyeye dönüştürülmediği sürece varsayılan kaynak EE kaynaklarının enjeksiyonu desteklenmez (ve bir kaynak sınıfını yönetilen bir fasülyeye dönüştürürken bazı kısıtlamalar olduğunu unutmayın) ._. – Graham

+0

@Stateless bayrağımın kaynaklarıma mükemmel bir şekilde çalıştı ve kesinlikle harika bir çözüm. Bu iki sayfa da kavramları biraz daha iyi anlamama yardımcı oldu: [EJB 3.1 VE REST - HAFİF IŞIK HİBRİDİ] (http://www.adam-bien.com/roller/abien/entry/ejb_3_1_and_rest) [Singletons] (https : //blogs.oracle.com/kensaks/entry/singletons) – Graham

7

Sen değişkenler init için listener kullanabilir ve aşağıdaki gibi web uygulaması başlamadan önce özniteliği, bir şey olarak bağlamına ayarlayabilirsiniz:

package org.paulvargas.shared; 

import java.util.HashMap; 
import java.util.Map; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

public class LoadConfigurationListener implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent sce) { 
     // read file or rdbms 
     ... 
     ServletContext context = sce.getServletContext(); 
     // set attributes 
     ... 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     ServletContext context = sce.getServletContext(); 
     // remove attributes 
     ... 
    } 

} 

Bu dinleyici web.xml yapılandırılır. ServletContext enjekte ve niteliğini almak için

<listener> 
    <listener-class>org.paulvargas.shared.LoadConfigurationListener</listener-class> 
</listener> 

Sen @Context ek açıklama kullanabilirsiniz.

package org.paulvargas.example.helloworld; 

import java.util.*; 

import javax.servlet.ServletContext; 
import javax.ws.rs.*; 
import javax.ws.rs.core.*; 

@Path("/world") 
public class HelloWorld { 

    @Context 
    private ServletContext context; 

    @GET 
    @Produces("text/plain; charset=UTF-8") 
    public String getGreeting() { 

     // get attributes 
     String someVar = (String) context.getAttribute("someName") 

     return someVar + " says hello!"; 
    } 

} 
+0

Bu kesinlikle çalışılabilir bir çözüm, ancak şu anda filtrelemek için hiçbiri ve ayrıca bazı ekstra iş var bir web.xml eklemekten ibarettir ServletContext'te bulunan diğer nitelikler. Bunu bir vekalet verdim, ancak hem daha basit hem de daha çok yönlü olduğu için diğer yazıya verilen cevabı vermek zorunda kaldım. – Graham