2013-06-28 22 views
5

Các phần mềm Adobe AEM cung cấp một số lớp học có thể mất một apache Sling Resource và thích ứng với nó đến lớp khác như vậy:Làm thế nào để thực hiện một AdapterFactory tùy chỉnh cho Sling Resource?

Page page = resource.adaptTo(Page.class); 

Để sử dụng cú pháp này với các lớp mà bạn tác giả và kiểm soát này nắm để chỉ đơn giản là thực hiện Giao diện Adaptable.

Tuy nhiên, nếu bạn muốn bật Tài nguyên để thích ứngĐối với lớp tùy chỉnh mới của bạn, có vẻ như bạn phải triển khai giao diện AdapterFactory và đăng ký nó trong OSGI.

Đây là cách Adobe website mô tả nó:

Bằng một AdapterFactory, có thể lập bản đồ đối tượng tùy ý. Các đối tượng vẫn phải thực hiện giao diện Thích nghi và phải mở rộng SlingAdaptable (chuyển cuộc gọi adaptTo đến trình quản lý bộ điều hợp trung tâm). Điều này cho phép móc vào cơ chế adaptTo cho các lớp hiện có, chẳng hạn như Tài nguyên.

Tôi đã đi qua mã SlingScriptAdapterFactory, nhưng cuối cùng tôi không kết nối các chấm ở đây. Về cơ bản tôi muốn làm điều này:

MyClass myClass = Resource.adaptTo(MyClass.class); 

Tôi tạo ra một lớp mà thực hiện AdapterFactory và chỉ cần triển khai nó với các gói kỳ vọng rằng Sling sẽ chỉ tìm thấy nó bằng loại hoặc là có nhiều hơn để nó?

Trả lời

4

Đây là tài liệu tốt hơn một chút https://sling.apache.org/documentation/the-sling-engine/adapters.html

Vì vậy, bạn nên thực hiện các giao diện thích ứng, như bạn đã mô tả. Sau đó tạo một AdapterFactory chú thích đúng:

@Component 
@Service(value=org.apache.sling.api.adapter.AdapterFactory.class) 
@Properties({ 
    @Property(name = "adaptables", value = { "org.apache.sling.api.resource.Resource" }), 
    @Property(name = "adapters", value = { "org.sling.MyClass" }) 
}) 
public class MyAdapterFactory implements AdapterFactory{ 
    public <AdapterType> AdapterType getAdapter(final Object adaptable, Class<AdapterType> type){ 
      return new MyClassAdapter(adaptable); 
    }  
} 
+0

Tôi đã có thể xác minh điều này và đó chỉ là những gì tôi cần. Tôi đã không hiểu rằng các ý kiến ​​trên trang web Apache đã phác thảo các chú thích SCR cần thiết để đăng ký bộ điều hợp của tôi [https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations. html] Bây giờ tôi chỉ cần tìm ra cách thể hiện thuộc tính chú thích của bộ điều hợp như là một tập hợp các lớp mà bộ điều hợp hỗ trợ. Cảm ơn! – jedatu

3

Lưu ý rằng tôi đã làm việc trên một cách đơn giản hơn để tạo ra adapter Sling, bằng cách chú thích phương pháp với một chú thích @Adapter mới, như trong

@Component 
    @Service 
    public class C implements AdapterMethodsProvider { 
    @Adapter 
    public CustomerRecord convert(Resource r) { ... } 

    @Adapter 
    public Person adaptToPerson(Resource r) { ... } 
    } 

Xem https://issues.apache.org/jira/browse/SLING-2938 để biết chi tiết, nhưng lưu ý rằng đây không phải là ngay cả trong thân Sling, do đó, nó sẽ mất một thời gian trước khi nó được phát hành và có sẵn trong AEM/CQ.

+0

Điều này sẽ thuận tiện. Tôi sẽ xem thử. Có vẻ như hài hòa với công việc là một phần của Slice [http://www.cognifide.com/blogs/cq/make-your-cq-life-easier-with-slice/] nhằm mục đích sử dụng chú thích để ánh xạ POJO thuộc tính cho thuộc tính Jcr. – jedatu

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