gpt4 book ai didi

java - 在 JAX-RS 请求之间共享变量

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:49 25 4
gpt4 key购买 nike

我有一个我认为是关于 JAX-RS 的非常基本的问题,但我无法轻易找到答案。

我正在尝试将使用“标准”Javax servlet 的 REST 服务(手动将请求路由到方法)重构为“更干净”的 JAX-RS 实现。当前应用程序在 servlet init() 期间设置了一些变量。它将这些分配为 HttpServlet 类的属性,因此它们在每个 doGet() 期间可用,并且可以作为参数传递给请求处理方法。为清楚起见,其中之一是充当缓存的 ConcurentHashMap。

现在,使用 JAX-RS,我可以扩展应用程序来设置我的资源类。我还可以在每个资源实现中使用 @Context 注释来在处理请求时注入(inject)诸如 ServletContext 之类的东西。但是我不知道如何在应用程序初始化期间类似地注入(inject)变量集。

我正在使用 JAX-RS 的 Apache Wink 1.3.0 实现。

最佳答案

您可以使用 listener在 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 注释来注入(inject) 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;
}

}

关于java - 在 JAX-RS 请求之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com