2011-12-21 6 views
9

Day CQ를 사용 중입니다. 필자는 Felix 콘솔에서 사용할 수있는 연결 풀을 사용하여 SQL Server DB에 일부 데이터를 저장하려고합니다.Sling/CQ 번들에서 OSGi 서비스 받기

sling.getService(DataSourcePool.class). 

는 그러나, 나는 클라이언트의 요청을 처리하기 위해 OSGi 번들에서 생성 된 서블릿을 사용하려면 태그 나는 defineObjects에 정의 유형 SlingScriptHelper의 '슬링'객체를 사용함으로써, JSP에서이 작업을 수행 할 수 있습니다. 서블릿에는 defineObjects 태그가 없으므로 "슬링"객체가 정의되지 않습니다. 내 서블릿에 유효한 SlingScriptHelper 객체를 만드는 방법이 보이지 않지만 가능한 것이어야합니다.

방법이 있습니까?

답변

17

Java OSGi 구성 요소에서 SlingScriptHelper가 필요없는 서비스를 얻으려면 BundleContext.getService (...) 메소드를 사용하거나 SCR 주석을 사용하여 SCR이 구성 요소에 서비스를 삽입하도록 할 수 있습니다.

@Reference 
    private SlingRepository repository; 

이 주석을 처리하는 Maven 플러그인에 대한 http://felix.apache.org/site/apache-felix-maven-scr-plugin.html를 참조하십시오 : 예를 들어, 당신은 예를 들어 ConfirmedOrdersObserver class이 방법으로 SlingRepository를 얻을, 슬링의 Slingbucks sample 사용하는 SCR 주석의 방법을 일부 구성 요소에서 볼 수있는 바와 같이

.

+0

나는 SCR 어노테이션 접근법을 사용할 수 있었다. BundleContext의 인스턴스를 어떻게 얻을 수 있습니까? 그것은 내가 알아낼 수없는 것이었다. – joelt

+0

이 테스트하지 않은 있지만 activate() 또는 bind() 메서드를 사용하여 수행 할 수 있다고 생각 해요. – joelt

+2

activate (..) 및 deactivate (..)에서 osgi ComponentContext 객체를 가져옵니다. 이 obj에서 BundleContext를 파생시킬 수 있습니다. Bertrand가 지적한 것처럼 번들 컨텍스트 객체는 필요하지 않습니다. DCS를 사용하여 서블릿 (슬링 서비스)에서 객체를 인스턴스화하면됩니다. – empire29

7

#getServiceReference 및 #getService 메소드를 사용하여 BundleContext를 사용하여 서비스에 연결할 수 있습니다. 당신이 ResourceResolverFactory에 관심이 있다면 예를 들어,과 같이 그것을 얻을 수 있습니다 :

BundleContext bundleContext = FrameworkUtil.getBundle(MyClass.class).getBundleContext(); 
ServiceReference factoryRef = bundleContext.getServiceReference(ResourceResolverFactory.class.getName()); 
ResourceResolverFactory resolverFactory = (ResourceResolverFactory) bundleContext.getService(factoryRef); 
+0

@Reference 주석을 사용하여 서비스를 내 번들 구성 요소에 추가하려고했습니다. 어떤 이유로 참조가 null이었습니다. 내 번들의 생성자에서 위의 코드를 사용하여 명시 적으로 서비스를 얻으려면 트릭을 수행하십시오. 고마워요 :) –

+0

고마워! @Reference가 "Resource not modifyable error"라는 질문을 던졌습니다. 이것은 효과가있다! – Jakolcz

0

YourClass OBJ = this.getSlingScriptHelper()의 getService (yourclass.class을).

obj.whatever();

관련 문제