Parent Resource ValueMap Value Injector

Available since version 4.9.0


Pulling parent component properties into the child component is currently not supported by Apache Sling Models. Parent Resource ValueMap Value injector/annotation addresses the scenario in which one or more components have to inherit parent component properties. This annotation functions similarly to the @ValueMapValue annotation; it gets the parent component property into the Sling Model if available. Injections are available when adapting either a Resource or SlingHttpServletRequest object.


  • It searches only the component hierarchy but not the page hierarchy and doesn’t search the page properties.
  • maxLevel can be configured on the annotation to set a limit on number of parent nodes to search and avoid overhead.
  • No alteration of existing functionality, i.e instance-level component properties are unaffected.

Problems Being Solved:

If there is a use-case in which multiple components inherit parent component properties, developers tend to:

  • Create custom methods and implementing multiple times for different components
  • Use JCR API to adapt Session/ResourceResolver to the respective parent component’s node

How to Use

  • Inject the properties into your component’s Sling Model using the @ParentResourceValueMapValue annotation.
  • Set the maxLevel property value if you know the level of the parent, or the parent of the parent component, which has the property you need.
  • Please note that if maxLevel is not explicitly set, it will set to default value -1.


@Model(adaptables = {Resource.class, SlingHttpServletRequest.class},
       adapters = {AccordionItem.class})
public class AccordionItemImpl implements AccordionItem {
   @ParentResourceValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, maxLevel = 2, name = "jcr:title")
   private String accordionTitle;

   @ParentResourceValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL)
   private String ctaButtonText;

   @ParentResourceValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL)
   private String ctaButtonLink;

   @ParentResourceValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, maxLevel = 1)
   private Boolean enableCta;
Please report any issues with the Feature or documentation on the ACS AEM Commons GitHub Issue tracker.