2013-05-29 20 views
10

Pracuję nad aplikacją, która działa na Glassfish. Mam zamiar przekształcić serwlety w odpowiednie, spokojne rzeczy, używając jax-rs i jersey.Metoda równoważnika metody init() w JAX-RS

Próbuję znaleźć obejście metody init(), ale do tej pory nie udało mi się.

Oto oryginalna część, wykorzystujące serwlety:

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

i to taki, który próbuję użyć 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"); 
} 

Sprawdziłem list mailingowych i googled wokół, ale kulisy znaleźć sposób, który może zadziałać w tej sprawie.

wszelkie pomysły, jak osiągnąć to samo zachowanie przy użyciu apletów dla metody init?

Odpowiedz

6

W końcu, po przeszukaniu trochę więcej, znalazłem odpowiednie rozwiązanie.

zasadniczo mam rozszerzoną klasę public class ContextListener implements ServletContextListener i zaimplementowałem abstrakcyjną metodę public void contextInitialized(ServletContextEvent sce), która jest wywoływana podczas ładowania aplikacji. Przeniosłem logikę z serwletu na tutaj w celu wykonania inicjalizacji i innych ustawień konfiguracyjnych, a potem wszystko przebiegło gładko.

+0

Jest to zdecydowanie najlepsze rozwiązanie, szczególnie jeśli chcesz pisać do pliku po zamknięciu serwera. Głównym celem mojego komentarza jest podziękować Ci za tę wspaniałą odpowiedź i pomóc przyszłym pracownikom Google w łatwiejszym znalezieniu tego schludnego rozwiązania. Oto świetny [przykład-SSCCE] (https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/). – Casper

+0

w rzeczywistości, jeśli jesteś w koszulce, możesz zamiast tego użyć 'ApplicationEventListener' – svarog

6

Użyj @PostConstruct; przykład z aplikacji internetowej:

@Context 
private ServletContext context; 

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

nie działał ... Metoda nie nazwano natomiast wniosek został zainicjowany. czy może to być spowodowane wewnętrznymi problemami ze szklanymi rybkami? lub czy brakuje mi innych konfiguracji? – stephanruhl

+0

To działa dla mnie na Glassfish 3.1.1 przy użyciu dostarczonej realizacji Jersey.Jeśli używasz NetBeans, utwórz nowy projekt za pomocą _Samples > Java Web Services > REST: Hello World (Java EE 6) _ i porównaj swoje deskryptory (web.xml, itp.) Z tymi, które tam były. – McDowell

+0

znalazłem inny sposób rozwiązania problemu, dziękuję – stephanruhl

2

Oto jak zaimplementowałem metodę init w Jersey 2.6/JAX-RS na wypadek, gdyby pomogło komukolwiek. Jest to za pomocą sugestii @PostConstruct.

Poniższy kod uruchamia aplikację, skanowanie wszystkich zasobów w pakiecie i inicjalizuje licznik statyczny test z 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()); 
    } 
} 

I tu jest związany build.xml, który musi odnosić się do tego Klasa (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> 

Stąd właśnie stworzyć "test" zasób do sprawdzenia licznika:

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

Licznik powinien zostać zainicjowany o wartości 3 + 1, a następnie odświeżyć zasób będzie po prostu ją zwiększyć o 1.

0

Można utworzyć ServletContextClass i dodać tag <listener> do web.xml

słuchacza tag ładuje ServerContextClass przy uruchomieniu aplikacji internetowej. Wewnątrz metody contextInitialized można uzyskać dostęp do kontekstu, jak poniżej:

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

zobacz similar example here