JAX-RS를 사용하여 Java에서 REST 웹 서비스를 구현하는 데 익숙해졌으며 다음 문제가 발생했습니다. 내 리소스 클래스 중 하나는 StorageEngine
인터페이스 뒤에 추상화되어있는 저장소 백엔드에 대한 액세스가 필요합니다. 현재 StorageEngine
인스턴스를 REST 요청을 처리하는 리소스 클래스에 삽입하고 싶습니다.이 작업을 수행하는 좋은 방법은 @Context
주석과 적절한 ContextResolver
클래스를 사용하는 것이라고 생각했습니다.JAX-RS에서 @Context, @Provider 및 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
클래스를 멋지게 집계합니다 (타임 스탬프 및 불필요한 항목은 의도적으로 삭제되었습니다) :
하지만, 내 자원 클래스에 storage
의 값은 항상 null
합니다 - StorageEngineProvider
의 생성자이나 그 getContext
방법은 지금, 뉴저지에 의해 불려도. 여기서 내가 뭘 잘못하고 있니?
FWIW 당신은 또한 약간 짧은 수행 할 수 있습니다 @Context ContextResolver을 storageEngineResolver; –
테스트 및 프로덕션 컨텍스트에서 대체 백업 구현을 제공하는 것만 큼 무언가를하는 것이 그렇게 어렵다는 것은 얼마나 우스 꽝입니다! 최소한 이것은 다른 프레임 워크에서 드래그 할 필요없이 작동합니다. –
Doug의 솔루션 (코멘트에서)이 나를 위해 작동하지 않았다 (RestEasy 포함). –