gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:06:28 29 4
gpt4 key购买 nike

我刚刚熟悉使用 JAX-RS 在 Java 中实现 REST Web 服务,但遇到了以下问题。我的资源类之一需要访问存储后端,该后端被抽象为 StorageEngine 接口(interface)。我想将当前的 StorageEngine 实例注入(inject)到服务于 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 的值始终是 null - 既不是 StorageEngineProvider 的构造函数,也不是它的 getContext 方法由 Jersey 调用,永远。我在这里做错了什么?

最佳答案

我认为没有一种特定于 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 上下文和依赖注入(inject) (JSR-299) 实现(应该在 Java EE 6 中可用)或其他依赖注入(inject)框架(例如 Google Guice)来帮助您。

关于java - 在 JAX-RS 中使用 @Context、@Provider 和 ContextResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047400/

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