web-dev-qa-db-fra.com

Méthode équivalente à la servlet init () dans JAX-RS

Je travaille sur une application qui tourne sur Glassfish. Je suis censé convertir les servlets en trucs reposants en utilisant jax-rs et jersey.

J'ai essayé de trouver une solution de contournement pour la méthode init (), mais jusqu'à présent, j'ai échoué.

Voici la pièce d'origine, à l'aide de servlets:

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

et celui-ci que j'essaie d'utiliser 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");
}

J'ai vérifié les listes de diffusion et cherché sur Google, mais je ne pouvais pas trouver un moyen qui pourrait fonctionner pour ce cas.

des idées comment obtenir le même comportement avec les servlets pour la méthode init?

12
denizdurmus

enfin, après avoir googlé un peu plus, j'ai trouvé une solution adéquate.

en gros, j'ai étendu la classe public class ContextListener implements ServletContextListener et mis en œuvre la méthode abstraite public void contextInitialized(ServletContextEvent sce) qui est appelée lorsque l'application est chargée. J'ai déplacé la logique de la servlet ici pour effectuer l'initialisation et d'autres paramètres de configuration, alors tout s'est déroulé sans heurts.

9
denizdurmus

Utilisez @PostConstruct ; exemple d'une application web:

@Context
private ServletContext context;

@PostConstruct
public void init() {
  // init instance
}
7
McDowell

Voici comment j'ai implémenté une méthode init dans Jersey 2.6/JAX-RS au cas où cela aiderait quelqu'un. Ceci utilise la suggestion de @PostConstruct.

Le code ci-dessous lance l'application Web, analyse toutes les ressources du package et initialise un compteur de test statique avec 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());
    }
}

Et voici le build.xml associé, qui doit faire référence à cette 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>

A partir de là, créez simplement une ressource "test" pour vérifier le compteur:

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

Le compteur doit être initialisé avec la valeur 3 + 1, et l'actualisation ultérieure de la ressource ne fera que l'augmenter de 1.

5
Pelpotronic

Vous pouvez créer une ServletContextClass et ajouter la balise <listener> au fichier web.xml.

La balise listener charge ServerContextClass au démarrage de votre application Web. Dans la méthode contextInitialized, vous pouvez accéder au contexte comme ci-dessous:

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

Reportez-vous à exemple similaire ici

1
Kobby Kan