当前位置: 首页 > 面试题库 >

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

何修能
2023-03-14
问题内容

我有一个关于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-html" target="_blank">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;
    }

}


 类似资料:
  • 我想验证一个发出请求的用户。为此,我有两个过滤器:AuthenticationFilter和authorizationfilter。AuthenticationFilter从请求中提取令牌并从数据库中查找用户。AuthorizationFilter检查该用户(由上一个筛选器检索)是否具有必要的权限。我有两个可能的解决方案,想知道每一个的利弊,我应该使用哪一个。我还需要访问实际业务逻辑中的用户。我的

  • 问题内容: 我有一个下载器功能,可以并行下载多个文件。我使用以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数()。 是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数? 问题答案: 解决方案是利用新进程并传递共享的ctypes值:

  • 问题内容: 我正在使用Python模块(PyCLIPS)和Django 1.3。 我想开发一个线程安全类,该类可实现对象池和Singleton模式,并且还必须在Django中的请求之间共享。 例如,我要执行以下操作: 请求从池中获取具有某些ID的对象,对其进行处理,然后将其推回池中,然后发送带有对象ID的响应。 另一个具有对象ID的请求从池中获取具有给定ID的对象,并重复上述请求中的步骤。 但是对

  • 我在Spring控制器的2个webservice中使用了相同的ArrayList,所以我想使用请求或会话范围从DB中获取一次,我尝试制作一个bean } 在控制器中 application context CTX = new AnnotationConfigApplicationContext(example bean。类);AttendeesBean attendee bean = CTX .

  • 问题内容: 我希望能够从请求中打印JAX-RS 2 JSON有效负载,而不管我的应用程序服务器上的实际实现如何。 我已经尝试过在SO上提出建议的解决方案,但是所有解决方案都包含实际实现中的二进制文件(例如Jersey和类似文件),并且只允许在我的应用程序中使用javaee- api v 7.0。 我尝试在我的客户端上实现ClientRequestFilter和ClientResponseFilte

  • 我们正在使用JAX RS为我们的一个项目实现一个REST API。要求是用户将以JSON格式传入请求对象。 让我们假设我们有一个在命中APIendpoint时调用的方法 示例请求对象: { “firstName”:“Test”, “lastName”:“Name”, “sno”:“A123” } 吸气剂和setter 现在,如果用户尝试向上面给出的请求对象添加其他参数(例如:“age”)并调用ap