2013-05-29 16 views
10

Sto lavorando a un'applicazione in esecuzione su Glassfish. Dovrei convertire i servlet in roba adeguata, usando jax-rs e jersey.Servlet init() metodo equivalente in JAX-RS

Ho cercato di trovare una soluzione alternativa per il metodo init(), ma fino ad ora non sono riuscito.

qui è la parte originale, utilizzando servlet:

import javax.servlet.* 

public void init(ServletConfig config) throws ServletException { 
super.init(config); 
if (!isRunning() == true)) { 
    /* Do some stuff here*/ 
} 

logger.info("Deamon has started"); 
} 

e questo quello che sto cercando di usare JAX-RS

import javax.ws.rs.* 
import javax.servlet.* 

public void init(@Context ServletConfig config) throws ServletException { 
//uper.init(config); 
if (!isRunning() == true)) { 
    /* Do some stuff here*/ 
} 

logger.info("Deamon has started"); 
} 

ho controllato mailing list e su Google in giro, ma riusciva a trovare un modo che potrebbe funzionare per questo caso.

qualche idea su come ottenere lo stesso comportamento con le servlet per il metodo init?

risposta

6

infine, dopo aver cercato su Google un po 'di più, ho trovato una soluzione adeguata.

in pratica, ho esteso la classe public class ContextListener implements ServletContextListener e implementato il metodo astratto public void contextInitialized(ServletContextEvent sce) che viene chiamato quando viene caricata l'applicazione. Ho spostato la logica dal servlet a qui per eseguire l'inizializzazione e altre impostazioni di configurazione, quindi è stata fluida.

+0

Questa è sicuramente la soluzione migliore, soprattutto se si desidera scrivere su file all'arresto del server. Lo scopo principale del mio commento è ringraziarvi per questa grande risposta e aiutare i futuri googler a trovare più facilmente questa soluzione pulita. Ecco un ottimo [esempio-SSCCE] (https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/). – Casper

+0

in realtà se sei su jersey puoi usare 'ApplicationEventListener' invece – svarog

6

Utilizzare @PostConstruct; esempio da un'applicazione web:

@Context 
private ServletContext context; 

@PostConstruct 
public void init() { 
    // init instance 
} 
+0

lavoro non ha ancora ... Il metodo non è stato chiamato mentre l'applicazione è stata inizializzata. potrebbe essere a causa di alcune cose interne con glassfish? o mi mancano alcune altre configurazioni? – stephanruhl

+0

Questo funziona per me su Glassfish 3.1.1 utilizzando l'implementazione di Jersey fornita.Se si utilizza NetBeans, creare un nuovo progetto utilizzando _Samples > Servizi Web Java > REST: Hello World (Java EE 6) _ e confrontare i descrittori (web.xml, ecc.) Con quelli utilizzati lì. – McDowell

+0

ho trovato un altro modo per risolvere il problema, grazie – stephanruhl

2

Ecco come ho implementato un metodo init in Jersey 2.6/JAX-RS nel caso in cui aiuti chiunque. Questo sta usando il suggerimento di @PostConstruct.

Il codice qui sotto inizia la web app, scansioni per tutte le risorse nel pacchetto e inizializza un contatore prova statica con 3:

package com.myBiz.myWebApp; 

import com.sun.net.httpserver.HttpServer; 
import java.io.IOException; 
import java.net.URI; 
import java.util.Set; 
import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
import javax.ws.rs.core.Application; 

public class WebApplication extends Application { 
    // Base URI the HTTP server will listen to 
    public static final String BASE_URI = "http://localhost:8080/"; 
    public static int myCounter = 0; 

    /** 
    * Starts a server, initializes and keeps the server alive 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     final HttpServer server = startServer(); 
     initialize(); 
     System.out.println("Jersey app started\nHit enter to stop it..."); 
     System.in.read(); 
     server.stop(1); 
     System.out.println("Server stopped successfully."); 
    } 

    /** 
    * Default constructor 
    */ 
    public WebApplication() { 
     super(); 
    } 

    /** 
    * Initialize the web application 
    */ 
    @PostConstruct 
    public static void initialize() { 
     myCounter = myCounter + 3; 
    } 

    /** 
    * Define the set of "Resource" classes for the javax.ws.rs.core.Application 
    */ 
    @Override 
    public Set<Class<?>> getClasses() { 
     return getResources().getClasses(); 
    } 

    /** 
    * Scans the project for REST resources using Jersey 
    * @return the resource configuration information 
    */ 
    public static ResourceConfig getResources() { 
     // create a ResourceConfig that scans for all JAX-RS resources and providers in defined package 
     final ResourceConfig config = new ResourceConfig().packages(com.myBiz.myWebApp); 
     return config; 
    } 

    /** 
    * Starts HTTP server exposing JAX-RS resources defined in this application. 
    * @return HTTP server. 
    */ 
    public static HttpServer startServer() { 
     return JdkHttpServerFactory.createHttpServer(URI.create(BASE_URI), getResources()); 
    } 
} 

Ed ecco il build.xml associato, che ha bisogno di fare riferimento a questo classe (WebApplication):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <!-- The following instantiates the class WebApplication, resources are scanned on WebApplication object creation and init is done as well --> 
    <servlet> 
     <servlet-name>myWebApp</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.myBiz.myWebApp.WebApplication</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>myWebApp</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

da qui, basta creare una risorsa "test" per controllare il contatore:

package com.myBiz.myWebApp; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import com.myBiz.myWebApp.WebApplication; 

@Path("/test") 
public class ResourceTest { 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getResource() { 
     WebApplication.myCounter++; 
     return "Counter: " + WebApplication.myCounter; 
    } 
} 

Il contatore deve essere inizializzato con il valore di 3 + 1, e successivamente aggiornare la risorsa sarà solo aumentarlo di 1.

0

È possibile creare un ServletContextClass e aggiungere il tag <listener> al web.xml

L'ascoltatore tag carica il ServerContextClass all'avvio della tua applicazione web. All'interno del metodo contextInitialized è possibile accedere al contesto, come di seguito:

public void contextInitialized(ServletContextEvent arg0){ 
    ServletContext context = arg0.getServletContext(); 
} 

Fare riferimento alla similar example here

Problemi correlati