2011-12-21 27 views
9

Tôi đang sử dụng Ngày CQ. Tôi muốn lưu trữ một số dữ liệu trong một SQL Server DB, sử dụng hồ bơi kết nối có sẵn trong giao diện điều khiển Felix. Tôi có thể làm điều này từ một JSP, bằng cách sử dụng các "sling" đối tượng của loại SlingScriptHelper định nghĩa trong defineObjects tagNhận các dịch vụ OSGi từ một gói trong Sling/CQ

sling.getService(DataSourcePool.class). 

Tuy nhiên, tôi muốn sử dụng một servlet tạo ra trong một gói OSGi để xử lý các yêu cầu từ khách hàng. Servlet không có thẻ defineObjects, vì vậy đối tượng "sling" không được định nghĩa. Tôi không nhìn thấy một cách để tạo ra một đối tượng SlingScriptHelper hợp lệ trong servlet của tôi, nhưng có vẻ như nó phải là có thể.

Có cách nào không?

Trả lời

17

Để nhận dịch vụ từ thành phần java OSGi bạn không cần SlingScriptHelper, bạn có thể sử dụng phương thức BundleContext.getService (...) hoặc sử dụng chú thích SCR để cho phép SCR tiêm dịch vụ trong thành phần của bạn.

Như một ví dụ, bạn có thể nhìn vào cách mà một số thành phần trong Slingbucks sample sử dụng SCR chú thích Sling, những ConfirmedOrdersObserver class ví dụ được các SlingRepository theo cách này:

@Reference 
    private SlingRepository repository; 

Xem http://felix.apache.org/site/apache-felix-maven-scr-plugin.html cho plugin Maven để xử lý các chú thích này .

+0

Tôi đã có thể sử dụng phương pháp chú thích SCR. Làm thế nào tôi sẽ nhận được một thể hiện của BundleContext, mặc dù? Đó là điều mà tôi không thể đoán ra được. – joelt

+0

Tôi chưa thử nghiệm điều này, nhưng tôi nghĩ rằng nó có thể được thực hiện bằng cách sử dụng các phương thức activate() hoặc bind(). – joelt

+2

Trong kích hoạt (..) và hủy kích hoạt (..) lấy một đối tượng osgi ComponentContext. Từ obj này, bạn có thể lấy được BundleContext. Bạn không nên cần đối tượng context context như Bertrand đã chỉ ra; bạn chỉ cần sử dụng DCS khởi tạo các đối tượng của bạn trong servlet của bạn (đó là dịch vụ sling). – empire29

7

Bạn có thể sử dụng BundleContext để truy cập Dịch vụ bằng cách sử dụng phương thứC#getServiceReference và #getService. Ví dụ, nếu bạn đã quan tâm đến các ResourceResolverFactory, bạn có thể nhận được nó như vậy:

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

Tôi đã thử sử dụng chú thích @Reference để thêm dịch vụ vào thành phần gói của tôi. Đối với một số lý do các tài liệu tham khảo là null. Sử dụng mã này ở trên trong hàm tạo của gói của tôi, để nhận được các dịch vụ một cách rõ ràng, đã thực hiện thủ thuật. Cảm ơn :) –

+0

Cảm ơn! @Reference đã ném cho tôi một "Lỗi không thể sửa đổi tài nguyên". Điều này đã làm việc! – Jakolcz

0

YourClass obj = this.getSlingScriptHelper() getService (yourclass.class);.

obj.whatever();

Các vấn đề liên quan