Я просто познакомился с внедрением веб-сервисов REST на Java с использованием JAX-RS, и я столкнулся с следующей проблемой. Один из моих классов ресурсов требует доступа к серверу хранения, который абстрагируется от интерфейса StorageEngine
. Я хотел бы ввести текущий экземпляр StorageEngine
в класс ресурсов, обслуживающий запросы REST, и я подумал, что хорошим способом сделать это будет использование аннотации @Context
и соответствующего класса ContextResolver
. Это то, что я до сих пор:Использование @Context, @Provider и ContextResolver в JAX-RS
В 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
называют Джерси, когда-либо. Что я здесь делаю неправильно?
FWIW вы также можете сделать немного короче: @ Контекст ContextResolver storageEngineResolver; –
Как смешно, что так сложно сделать что-то столь же нормальное, как предоставление альтернативных реализаций поддержки в тестовых и производственных контекстах! По крайней мере, это работает без необходимости перетаскивать некоторые другие рамки. –
Решение Doug (FROM COMMENTS) не сработало для меня (с RestEasy). –