Я только знакомлюсь с реализацией веб-сервисов REST в Java с использованием JAX-RS и столкнулся со следующей проблемой. Один из моих классов ресурсов требует доступа к серверной части хранилища, которая абстрагируется от интерфейса StorageEngine
. Я хотел бы внедрить текущий экземпляр StorageEngine
в класс ресурсов, обслуживающий запросы REST, и я подумал, что хорошим способом сделать это будет использование аннотации @Context
и соответствующего класса ContextResolver
. Это то, что я до сих пор:
В MyResource.java
:
class MyResource {
@Context StorageEngine storage;
[...]
}
In 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
метод. Что я тут не так делаю?