Sling delegation error | Community
Skip to main content
Level 2
May 18, 2025
Solved

Sling delegation error

  • May 18, 2025
  • 2 replies
  • 471 views

Hello All,

 

In slingmodel trying to get layoutcontainer models methods, as below

I added below code ContainerImpl

@Self

@2434638(type=Layoutcontainer.class)

Delegate(types=Layoutcontainer.class)

LayoutContainer layoutContainer;

 

But when I access the getLayout method from htl getting error cannot access method ComtainerImpl.getLayout() it is getting for all the methods of LayoutContianer

Any suggestions for solving this error.

Thanks in advance.

 

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by MukeshYadav_

Hi @kkeerthi ,

@Delegate is lombok experimental feature as the official documentation states -

"Current status: negative - Currently we feel this feature will not move out of experimental status anytime soon, and support for this feature may be dropped if future versions of javac or ecj make it difficult to continue to maintain the feature." https://projectlombok.org/features/experimental/Delegate

You may try to keep all the methods, as all the methods of accordion is kept as shown below

package com.projectname.aem.core.models; import com.adobe.cq.export.json.ExporterConstants; import com.adobe.cq.wcm.core.components.models.Accordion; import com.adobe.cq.wcm.core.components.models.PanelContainerItem; import com.adobe.cq.wcm.core.components.models.datalayer.ComponentData; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Exporter; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Via; import org.apache.sling.models.annotations.injectorspecific.Self; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; import org.apache.sling.models.annotations.via.ResourceSuperType; import java.util.List; @Model(adaptables = SlingHttpServletRequest.class, adapters = { Accordion.class, ValueAccordionModel.class }, resourceType = ValueAccordionModel.RESOURCE_TYPE, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) @Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION) public class ValueAccordionModel implements Accordion { @Self @Via(type = ResourceSuperType.class) Accordion accordion; public static final String RESOURCE_TYPE = "projectname/components/core/accordion"; @ValueMapValue private String arrowIcon; public String getArrowIcon(){ return arrowIcon; } @Override public boolean isSingleExpansion() { return accordion.isSingleExpansion(); } @Override public String getHeadingElement() { return accordion.getHeadingElement(); } @Override public List<? extends PanelContainerItem> getChildren() { return accordion.getChildren(); } @Override public String getAppliedCssClasses() { return accordion.getAppliedCssClasses(); } @Override public String[] getExpandedItems() { return accordion.getExpandedItems(); } @Override public ComponentData getData() { return accordion.getData(); } @Override public String getId() { return accordion.getId(); } }

 

Thanks

2 replies

MukeshYadav_
Community Advisor
MukeshYadav_Community AdvisorAccepted solution
Community Advisor
May 19, 2025

Hi @kkeerthi ,

@Delegate is lombok experimental feature as the official documentation states -

"Current status: negative - Currently we feel this feature will not move out of experimental status anytime soon, and support for this feature may be dropped if future versions of javac or ecj make it difficult to continue to maintain the feature." https://projectlombok.org/features/experimental/Delegate

You may try to keep all the methods, as all the methods of accordion is kept as shown below

package com.projectname.aem.core.models; import com.adobe.cq.export.json.ExporterConstants; import com.adobe.cq.wcm.core.components.models.Accordion; import com.adobe.cq.wcm.core.components.models.PanelContainerItem; import com.adobe.cq.wcm.core.components.models.datalayer.ComponentData; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Exporter; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Via; import org.apache.sling.models.annotations.injectorspecific.Self; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; import org.apache.sling.models.annotations.via.ResourceSuperType; import java.util.List; @Model(adaptables = SlingHttpServletRequest.class, adapters = { Accordion.class, ValueAccordionModel.class }, resourceType = ValueAccordionModel.RESOURCE_TYPE, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) @Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION) public class ValueAccordionModel implements Accordion { @Self @Via(type = ResourceSuperType.class) Accordion accordion; public static final String RESOURCE_TYPE = "projectname/components/core/accordion"; @ValueMapValue private String arrowIcon; public String getArrowIcon(){ return arrowIcon; } @Override public boolean isSingleExpansion() { return accordion.isSingleExpansion(); } @Override public String getHeadingElement() { return accordion.getHeadingElement(); } @Override public List<? extends PanelContainerItem> getChildren() { return accordion.getChildren(); } @Override public String getAppliedCssClasses() { return accordion.getAppliedCssClasses(); } @Override public String[] getExpandedItems() { return accordion.getExpandedItems(); } @Override public ComponentData getData() { return accordion.getData(); } @Override public String getId() { return accordion.getId(); } }

 

Thanks

AmitVishwakarma
Community Advisor
Community Advisor
May 20, 2025

Hi @kkeerthi ,

Try below solution:

 

Use @Via(type = ResourceSuperType.class) and explicitly call methods.

package com.example.core.models; import com.adobe.cq.wcm.core.components.models.LayoutContainer; import com.adobe.cq.export.json.ExporterConstants; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.models.annotations.*; import org.apache.sling.models.annotations.injectorspecific.Self; @Model( adaptables = SlingHttpServletRequest.class, adapters = { LayoutContainer.class, CustomLayoutContainer.class }, resourceType = CustomLayoutContainer.RESOURCE_TYPE, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL ) @Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION) public class CustomLayoutContainer implements LayoutContainer { public static final String RESOURCE_TYPE = "your-project/components/customlayoutcontainer"; @Self @Via(type = ResourceSuperType.class) private LayoutContainer layoutContainer; // Example of adding a custom method public String getCustomLogic() { return "Custom logic based on layout"; } // Now, delegate all required methods explicitly @Override public String getLayout() { return layoutContainer.getLayout(); } @Override public String getAppliedCssClasses() { return layoutContainer.getAppliedCssClasses(); } @Override public String getId() { return layoutContainer.getId(); } // Add other LayoutContainer methods you want to expose... }

HTL Usage:

<div data-layout="${model.layout}" class="${model.appliedCssClasses}"> Layout: ${model.layout} </div>

 

Note:

Use IntelliJ’s “Delegate Methods” Shortcut

In IntelliJ, right-click => Generate => Delegate Methods… to auto-generate the method calls from layoutContainer.

Regards,
Amit