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.
Solved! Go to Solution.
Views
Replies
Total Likes
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
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
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
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies