Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.

How to create custom Sling Model for Pages that inherits from Core Component model?

Avatar

Level 5

All of the pages on my site have their own sling types set up, and the sling:resourceSuperType inheritance is:

 

myapp/components/pages/page-type --> sling:resourceSuperType --> myapp/components/page --> core/wcm/components/page/v3/page

 

Now, I am trying to create a model for myapp/components/page called BasePageModel.  I am using queryBuilder to retrieve a list of resources, and I want to adapt each one to an instance of BasePageModel to simplify the logic around reading properties.

 

What model can I inherit from in Java to get some base functionality for core/wcm/components/page/v3/page?

 

For instance, I don't want to rewrite the logic around Vanity URLs or retrieving the page's featured image.  How can I simply inherit more base functionality from the core components and extend it with my own custom properties in Java?

 

I've found this page interface: aem-core-wcm-components/Page.java at main · adobe/aem-core-wcm-components (github.com) ... this is basically the functionality I want to inherit on my BasePageModel (not override).

 

Here's the corresponding model in Core components for page v3 (ultimately what I am inheriting from in sling): aem-core-wcm-components/PageImpl.java at main · adobe/aem-core-wcm-components (github.com) ... but this is marked internal.  It's also only adaptable from a SlingHttpServletRequest, where as I need to adapt to this model from a Resource returned by a com.day.cq.search.Query.getResult() call.

 

How can I re-use the functionality of PageImpl from core components?

 

I tried injecting like this:

 

@Model(adaptables = { SlingHttpServletRequest.class, Resource.class }, 
       adapters = BasePage.class, // a simple interface
       resourceType = BasePageImpl.RESOURCE_TYPE, 
       defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class BasePageImpl implements BasePage  {
    final public static String RESOURCE_TYPE = "myapp/components/page";

    
    @Self
    
    private com.adobe.cq.wcm.core.components.models.Page page; // null at this point
}

 

 

2 Replies

Avatar

Level 5

I tried that, but the page object is null.  I suspect it's because I'm adapting from a resource and not a servlet request?

 

e.g.,

 

    @Self
    
    private com.adobe.cq.wcm.core.components.models.Page page; // null at this point