我刚刚熟悉使用 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我的资源类中的值始终是null- Jersey 的构造函数StorageEngineProvider及其getContext方法都不会被调用。我在这里做错了什么?