コミュニティアチーブメントバーを展開する。

Submissions are now open for the 2026 Adobe Experience Maker Awards.
解決済み

Sling delegation error

Avatar

Level 3

Hello All,

 

In slingmodel trying to get layoutcontainer models methods, as below

I added below code ContainerImpl

@Self

@Via(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.

 

1 受け入れられたソリューション

Avatar

正解者
Community Advisor

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 返信

Avatar

正解者
Community Advisor

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

Avatar

Community Advisor

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