Я просто познакомился с внедрением веб-сервисов REST на Java с использованием JAX-RS, и я столкнулся с следующей проблемой. Один из моих классов ресурсов требует доступа к серверу хранения, который абстрагируется от интерфейса 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
- ни один конструктор StorageEngineProvider
и его метод getContext
не вызывается Джерси. Что я здесь делаю неправильно?