web-dev-qa-db-ja.com

JAX-RSで同等のサーブレットinit()メソッド

Glassfishで実行されているアプリケーションに取り組んでいます。 jax-rsとjerseyを使用して、サーブレットを適切なRESTfulなものに変換することになっています。

私はinit()メソッドの回避策を見つけようとしていましたが、今まで失敗しました。

サーブレットを使用した元の部分は次のとおりです。

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

そして私が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");
}

メーリングリストをチェックしてグーグルで検索しましたが、このケースで機能する方法を見つけることができませんでした。

initメソッドのサーブレットで同じ動作を実現する方法はありますか?

13
denizdurmus

最後に、もう少しグーグルした後、私は適切な解決策を見つけました。

基本的に、私は_public class ContextListener implements ServletContextListener_クラスを拡張し、アプリケーションのロード時に呼び出される抽象メソッドpublic void contextInitialized(ServletContextEvent sce)を実装しました。初期化やその他の構成設定を行うために、ロジックをサーブレットからここに移動しましたが、スムーズでした。

10
denizdurmus

使用 @ PostConstruct ; Webアプリケーションの例:

@Context
private ServletContext context;

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

これが、Jersey 2.6/JAX-RSでinitメソッドを実装した方法です。これは@PostConstructの提案を使用しています。

以下のコードは、Webアプリを起動し、パッケージ内のすべてのリソースをスキャンして、静的テストカウンターを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());
    }
}

そして、これが関連するbuild.xmlであり、このクラス(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>

ここから、「テスト」リソースを作成してカウンターを確認します。

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

カウンターは値3+ 1で初期化する必要があり、その後リソースを更新すると、リソースが1だけ増加します。

4
Pelpotronic

ServletContextClassを作成し、<listener>タグをweb.xmlに追加できます。

リスナータグは、Webアプリケーションの起動時にServerContextClassをロードします。 contextInitializedメソッド内では、次のようにコンテキストにアクセスできます。

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

参照 ここに同様の例

2
Kobby Kan