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

在JAX-RS中使用@ Context,@ Provider和ContextResolver

宋飞文
2023-03-14
问题内容

我只是熟悉使用JAX-RS在Java中实现REST
Web服务,因此遇到了以下问题。我的资源类之一要求访问存储后端,该后端在StorageEngine接口后被抽象化。我想将当前StorageEngine实例注入到服务REST请求的资源类中,并且我认为这样做的一种好方法是使用@Context批注和适当的ContextResolver类。这是我到目前为止所拥有的:

MyResource.java

class MyResource {
    @Context StorageEngine storage;
    [...]
}

StorageEngineProvider.java

@Provider
class StorageEngineProvider implements ContextResolver<StorageEngine> {
    private StorageEngine storage = new InMemoryStorageEngine();

    public StorageEngine getContext(Class<?> type) {
        if (type.equals(StorageEngine.class))
            return storage;
        return null;
    }
}

com.sun.jersey.api.core.PackagesResourceConfig用来自动发现提供程序和资源类,并且根据日志,它StorageEngineProvider很好地拾取了该类(故意遗漏了时间戳和不必要的内容):

INFO: Root resource classes found:
    class MyResource
INFO: Provider classes found:
    class StorageEngineProvider

但是,storage资源类中的值始终是-
Jersey从来null没有调用过StorageEngineProvider它的构造函数或其getContext方法。我在这里做错了什么?


问题答案:

我认为没有JAX-RS特定的方法可以执行您想要的操作。最接近的是:

@Path("/something/")
class MyResource {
    @Context
    javax.ws.rs.ext.Providers providers;

    @GET
    public Response get() {
        ContextResolver<StorageEngine> resolver = providers.getContextResolver(StorageEngine.class, MediaType.WILDCARD_TYPE);
        StorageEngine engine = resolver.get(StorageEngine.class);
        ...
    }
}

但是,我认为@ javax.ws.rs.core.Context批注和javax.ws.rs.ext.ContextResolver确实适用于与JAX-
RS相关并支持JAX-RS提供程序的类型。

您可能需要寻找Java上下文和依赖注入(JSR-299)实现(应在Java EE 6中使用)或其他依赖注入框架(例如Google
Guice)来为您提供帮助。



 类似资料:
  • 我做了一个使用JAX-RS(RESTfull服务)的简单项目 我有一个JAX-RS(RESTfull service)webservice项目,它部署到JBoss6.1中。默认情况下,JBoss6.1提供了与JSON集成的resteasy。我想更改默认JSON资源的日期格式。 null 没有被调用,我仍然得到默认的JSON日期格式。 即使在pom.xml下添加以下依赖项也没有帮助: 有人知道为什么

  • 谁能给我解释一下什么是JAX-RS提供程序,以及'@Provider'注释做什么?我一直在阅读文档,但我没有得到它。 如果有资源类为传入的请求服务,提供者该怎么做?当我创建一个持久资源类(不是每个请求的资源类)时,它们与单例资源类有什么不同?或者这些类也是提供者?

  • 问题内容: 我在下面有这样的设置。这是一个简化的版本,但我认为它已涵盖了基本思想。我正在使用Jersey 2.16,Java 1.8和Glassfish Open Source 4.1 但是,当我部署并尝试访问Web服务时,我从安全上下文中得到了NullPointer异常。似乎根本没有注入上下文。我检查了这是secContext变量本身,而不仅仅是从getUserPrincipal()返回的nul

  • 所以我使用的是与JBoss捆绑在一起的RESTEasy。 类是: …最后,在类中,我有以下内容: 我的问题是: 为什么注射失败? 我有点厌倦了注释魔术在运行时失败,有没有一种方法可以不使用注释就获得? 或者,我的类是否可以获得并将其作为构造函数参数传递给类? 如果所有其他方法都失败了,我想我总是可以使用?自己读取和解析web.xml文件

  • 前一部分介绍 @Context 的使用。第5章描述了 JAX-RS 的所有标准的JAX-RS Java类型,可以使用 @Context。 当 JAX-RS 应用程序使用 servlet ,那么 ServletConfig 、ServletContext 、HttpServletRequest 和 HttpServletResponse,是可用 @Context 。