Hi All,
As of now AEM OOB model.json expose content fragment elements but not the fragment path. We have a requirement to expose the fragment path along with the model.json as part of our headless CMS requirement. I found that the Exporter contains the fragmentPath variable but not getter for that.
aem-core-wcm-components/ContentFragmentImpl.java at master · adobe/aem-core-wcm-components · GitHub
As this is inside internal package structure no idea on how to override this. What would be the solution to achieve the additional fragmentPath property?
Thanks
Solved! Go to Solution.
Views
Replies
Total Likes
You can extend any core component or customize functionality.
Try like this:
Step 1: Create an Interface to extend ContentFragment class and add a method to return path
Step 2: Implement the class , use Delegation
==== Declare an Interface to ContentFragment Extention Class =========
import com.adobe.cq.wcm.core.components.internal.models.v1.contentfragment;
/**
* An extension to the AEM Core Component ContentFragment
*/
public interface ContentFragmentExtention extends ContentFragment {
default String contentFragmentPath() {
throw new UnsupportedOperationException();
}
}
Step2:
==== Implementation your interface ContentFragmentExtention / Class =========
/**
* An extension to the AEM Core Component ContentFragment
*/
@Model(
adaptables = SlingHttpServletRequest.class,
adapters = { ContentFragmentExtention.class, ContentFragment.class, ComponentExporter.class },
resourceType = ContentFragmentExtentionImpl.RESOURCE_TYPE
)
@exporter(
name = ExporterConstants.SLING_MODEL_EXPORTER_NAME,
extensions = ExporterConstants.SLING_MODEL_EXTENSION
)
public class ContentFragmentExtentionImpl implements ContentFragmentExtention {
public static final String RESOURCE_TYPE = "<path to your proxy ContentFragment path> /apps/project/proxy/componetns/contentfragment";
@Deleted Account @Via(type = ResourceSuperType.class)
@Delegate(excludes = DelegationExclusion.class)
private ContentFragment contentFragment;
@ValueMapValue
private String contentFragmentPath; // This is a new property that we are introducing
/**
* implement your method
*
* @Return <your path>
*/
@Override
public String contentFragmentPath() {
<< Logic to get the path >>
return <Path to contentfragment>; //contentFragmentPath
}
}
You can extend any core component or customize functionality.
Try like this:
Step 1: Create an Interface to extend ContentFragment class and add a method to return path
Step 2: Implement the class , use Delegation
==== Declare an Interface to ContentFragment Extention Class =========
import com.adobe.cq.wcm.core.components.internal.models.v1.contentfragment;
/**
* An extension to the AEM Core Component ContentFragment
*/
public interface ContentFragmentExtention extends ContentFragment {
default String contentFragmentPath() {
throw new UnsupportedOperationException();
}
}
Step2:
==== Implementation your interface ContentFragmentExtention / Class =========
/**
* An extension to the AEM Core Component ContentFragment
*/
@Model(
adaptables = SlingHttpServletRequest.class,
adapters = { ContentFragmentExtention.class, ContentFragment.class, ComponentExporter.class },
resourceType = ContentFragmentExtentionImpl.RESOURCE_TYPE
)
@exporter(
name = ExporterConstants.SLING_MODEL_EXPORTER_NAME,
extensions = ExporterConstants.SLING_MODEL_EXTENSION
)
public class ContentFragmentExtentionImpl implements ContentFragmentExtention {
public static final String RESOURCE_TYPE = "<path to your proxy ContentFragment path> /apps/project/proxy/componetns/contentfragment";
@Deleted Account @Via(type = ResourceSuperType.class)
@Delegate(excludes = DelegationExclusion.class)
private ContentFragment contentFragment;
@ValueMapValue
private String contentFragmentPath; // This is a new property that we are introducing
/**
* implement your method
*
* @Return <your path>
*/
@Override
public String contentFragmentPath() {
<< Logic to get the path >>
return <Path to contentfragment>; //contentFragmentPath
}
}
Views
Replies
Total Likes
In case if you are looking for a custom solution https://aemlab.blogspot.com/2019/07/get-json-response-of-aem-page.html
Note: I did this as part of PoC, so not a production-ready code.
Views
Replies
Total Likes
Views
Likes
Replies