2013-05-29 53 views
10

我正在Glassfish上運行的應用程序上工作。我應該通過使用jax-rs和球衣來將servlet轉換爲適當的安靜的東西。在JAX-RS中相當於Servlet的init()方法

我一直在試圖找到init()方法的解決方法,但直到現在我失敗了。

原來這裏是一部分,使用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"); 
} 

而這一次,我想使用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"); 
} 

我檢查了郵件列表和周圍一派,但無法找到一種可以適用於這種情況的方法。

任何想法如何實現與servlet的init方法相同的行爲?

回答

6

最後,谷歌搜索了一下之後,我找到了一個合適的解決方案。

基本上,我已經擴展了 public class ContextListener implements ServletContextListener類,並實現了抽象方法public void contextInitialized(ServletContextEvent sce),它在加載應用程序時調用。我已經將servlet的邏輯移到了這裏來進行初始化和其他配置設置,然後它很流暢。

+0

這絕對是最好的解決方案,尤其是如果您想在服務器關閉時寫入文件。我的評論的主要目的是感謝您提供這個優秀的答案,並幫助未來的Google員工更輕鬆地找到這個簡潔的解決方案。 這是一個很棒的[example-SSCCE](https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/)。 – Casper

+0

實際上,如果你在球衣上,你可以使用'ApplicationEventListener' – svarog

6

使用@PostConstruct;從一個Web應用程序的例子:

@Context 
private ServletContext context; 

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

沒有工作......而初始化應用程序不調用方法。這可能是因爲玻璃魚內部的東西?還是我缺少一些其他配置? – stephanruhl

+0

這對我使用提供的Jersey實現的Glassfish 3.1.1有效。如果您使用NetBeans,請使用_Samples > Java Web Services > REST:Hello World(Java EE 6)_創建一個新項目,並將您的描述符(web.xml等)與那裏使用的描述符(web.xml等)進行比較。 – McDowell

+0

我找到了解決問題的另一種方法,謝謝 – stephanruhl

2

下面是我如何在澤西島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

0

您可以創建一個ServletContextClass<listener>標籤添加到web.xml

監聽器標籤在您的Web應用程序啓動時加載ServerContextClass。裏面的contextInitialized方法,你可以訪問下面的背景:

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

參考similar example here

相關問題