簡體   English   中英

在JAX-RS請求之間共享變量

[英]Share variables between JAX-RS requests

我有一個關於JAX-RS的非常基本的問題,但是我不知何故很難找到答案。

我正在嘗試將使用“標准” Javax servlet的REST服務重構為“手工”將請求路由到方法的“ REST服務”,使其成為“更干凈的” JAX-RS實現。 當前應用程序在servlet init()期間設置一些變量。 它將那些屬性分配為HttpServlet類的屬性,因此它們在每個doGet()期間都可用,並且可以作為參數傳遞給請求處理方法。 為了清楚起見,其中之一是充當緩存的ConcurentHashMap。

現在,借助JAX-RS,我可以擴展Application來設置資源類。 我還可以在每個資源實現中使用@Context批注在處理請求時注入ServletContext之類的東西。 但是我不知道如何類似地注入在應用程序初始化期間設置的變量。

我正在使用JAX-RS的Apache Wink 1.3.0實現。

您可以使用偵聽器初始化緩存,並在Web應用程序啟動之前將其設置為上下文作為屬性。 類似於以下內容:

package org.paulvargas.shared;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class CacheListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        Map<String, String> dummyCache = new HashMap<String, String>();
        dummyCache.put("greeting", "Hello Word!");

        ServletContext context = sce.getServletContext();
        context.setAttribute("dummyCache", dummyCache);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        context.removeAttribute("dummyCache");
    }

}

該偵聽器在web.xml配置。

<listener>
    <listener-class>org.paulvargas.shared.CacheListener</listener-class>
</listener>
<servlet>
    <servlet-name>restSdkService</servlet-name>
    <servlet-class>
        org.apache.wink.server.internal.servlet.RestServlet
    </servlet-class>
    <init-param>
        <param-name>applicationConfigLocation</param-name>
        <param-value>/WEB-INF/application</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>restSdkService</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

您可以使用@Context批注來注入ServletContext並檢索屬性。

package org.apache.wink.example.helloworld;

import java.util.*;

import javax.servlet.ServletContext;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

import org.apache.wink.common.model.synd.*;

@Path("/world")
public class HelloWorld {

    @Context
    private ServletContext context;

    public static final String ID = "helloworld:1";

    @GET
    @Produces(MediaType.APPLICATION_ATOM_XML)
    public SyndEntry getGreeting() {

        Map<String, String> dummyCache = 
                       (Map<String, String>) context.getAttribute("dummyCache");

        String text = dummyCache.get("greeting");

        SyndEntry synd = new SyndEntry(new SyndText(text), ID, new Date());
        return synd;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM