2013-05-12 11 views
6

Sto creando un servizio Web RESTful che avvolge un'API del fornitore antiquata. Sarà richiesta una configurazione esterna e verrà archiviata sul server in un file o in rdbms. Sto usando Jersey 1.11.1 in Glassfish 3.1.2. Questi dati di configurazione sono tutti in formato chiave/valore stringa.Come caricare e archiviare le variabili globali in Jersey/Glassfish

La mia prima domanda è questa: dove posso memorizzare le variabili globali/di istanza in Jersey in modo che vengano mantenute tra le richieste e disponibili per tutte le risorse? Se questa fosse una pura applicazione Servlet, userei ServletContext per realizzare questo.

La seconda parte della domanda è: come posso caricare la configurazione una volta caricato il server Jersey? Di nuovo, la mia analogia servlet sarebbe quella di trovare l'equivalente al metodo init().

risposta

11

@Singleton @Startup EJB corrisponde alle vostre esigenze.

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

EDIT: Aggiunto annotazione secondo il commento di Graham

+0

Sembra un'ottima soluzione e funziona correttamente al momento del caricamento, ma ricevo una InvocationTargetException (visualizzata come NullPointerException dal contenitore) quando provo a fare riferimento a questo EJB nelle mie classi di risorse. – Graham

+0

Dalla mailing list di Jersey: _Per l'iniezione predefinita di risorse EE non sono supportate a meno che non si trasformi la risorsa in un bean gestito (e si noti che ci sono alcuni vincoli quando si trasforma una classe di risorse in un bean gestito) ._ – Graham

+0

Una volta aggiunto un @Stateless flag per le mie risorse ha funzionato perfettamente ed è sicuramente un'ottima soluzione. Queste due pagine mi hanno aiutato a capire un po 'meglio i concetti: [EJB 3.1 E REST - THE HYBRID LEGGERO] (http://www.adam-bien.com/roller/abien/entry/ejb_3_1_and_rest) [Singletons] (https : //blogs.oracle.com/kensaks/entry/singletons) – Graham

7

è possibile utilizzare un listener per init le variabili e impostare il contesto come attributo prima dell'inizio applicazione web, qualcosa di simile al seguente:

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 
     ... 
    } 

} 

Questo ascoltatore è configurato nel web.xml.

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

È possibile utilizzare il @Context annotazioni per iniettare il ServletContext e recuperare l'attributo.

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

Questo è sicuramente una soluzione praticabile, ma comporta l'aggiunta di un web.xml dove Al momento ho nessuno e anche qualche lavoro extra al fine di filtrare gli altri attributi che esistono nel ServletContext. Ho dato questo un upvote, ma ho dovuto assegnare la risposta all'altro post in quanto è sia più semplice che più versatile. – Graham

Problemi correlati