You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Julian Sedding (Jira)" <ji...@apache.org> on 2021/08/27 09:15:00 UTC

[jira] [Comment Edited] (SLING-10738) Sling Model inheritance breaks with component exporter

    [ https://issues.apache.org/jira/browse/SLING-10738?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17405697#comment-17405697 ] 

Julian Sedding edited comment on SLING-10738 at 8/27/21, 9:14 AM:
------------------------------------------------------------------

[~cshawaus] I've finally taken the time to check this out. For me it works flawlessly with {{org.apache.sling.models.impl}} version {{1.4.16}}. Or I am testing the wrong thing. I am requesting {{/content/demo/us/en.model.json}} and I get lots of rendered JSON, which includes the property "myCustomProperty". Note: I did remove your workaround for the tests.

One thing I noticed is that you set the default injection strategy to "optional". I don't understand why, but in any case you should at least make the "layoutContainer" field "required" in order to fail early and hopefully get a meaningful error message in the logs.

If I misunderstood your problem, please advise on how to test with a few simple bullet points.


was (Author: jsedding):
[~cshawaus] I've finally taken the time to check this out. For me it works flawlessly, or I am testing the wrong thing. I am requesting {{/content/demo/us/en.model.json}} and I get lots of rendered JSON, which includes the property "myCustomProperty". Note: I did remove your workaround for the tests.

One thing I noticed is that you set the default injection strategy to "optional". I don't understand why, but in any case you should at least make the "layoutContainer" field "required" in order to fail early and hopefully get a meaningful error message in the logs.

If I misunderstood your problem, please advise on how to test with a few simple bullet points.

> Sling Model inheritance breaks with component exporter
> ------------------------------------------------------
>
>                 Key: SLING-10738
>                 URL: https://issues.apache.org/jira/browse/SLING-10738
>             Project: Sling
>          Issue Type: Bug
>          Components: Sling Models
>            Reporter: Chris Shaw
>            Priority: Major
>
> Hi,
> I'm currently supporting a project where I need to extend the LayoutContainer class in AEM Core Components. Completing this process was easy and straightforward when solely dealing solely with Sling Model Delegation. Shortly after confirming this behaviour was working correctly, I added Adobe's *ContainerExporter.class* to the *@Model* adapters and noticed that Sling Model Delegation stopped working.
> I am raising this issue here first because the same method of extending models in AEM Core Components works without issue except for the LayoutContainer model. Below is the basic code before adding the exporters.
> {code:java}
> @Model(
>         adaptables = SlingHttpServletRequest.class,
>         adapters = {LayoutContainer.class},
>         resourceType = CustomContainerImpl.RESOURCE_TYPE,
>         defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL
> )
> public class CustomContainerImpl implements LayoutContainer {
>     protected static final String RESOURCE_TYPE = "project/components/custom-container";
>     @Self
>     @Via(type = ResourceSuperType.class)
>     private LayoutContainer layoutContainer;
>     
>     // ... implementation
> }
> {code}
> With this code, no issues at a page level are observed and all inherited behaviours work as expected including appending *.model.json* to the page URL.
> Once I move beyond this and apply the exporter adapters, *.model.json* no longer works correctly and Sling Model Delegation breaks completely.
> {code:java}
> @Model(
>         adaptables = SlingHttpServletRequest.class,
>         adapters = {LayoutContainer.class, ComponentExporter.class, ContainerExporter.class},
>         resourceType = CustomContainerImpl.RESOURCE_TYPE,
>         defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL
> )
> public class CustomContainerImpl implements LayoutContainer {
>     protected static final String RESOURCE_TYPE = "project/components/custom-container";
>     @Self
>     @Via(type = ResourceSuperType.class)
>     private LayoutContainer layoutContainer;
>     
>     // ... implementation
> }
> {code}
> Note that the adapters are: *ComponentExporter.class* and *ContainerExporter.class*.
> What can be observed are 2 key issues:
>  # The *layoutContainer* property always returns *null*
>  # The previous JSON structure containing *root* elements is always empty for child pages
> As a workaround to at least ensure the inheritance works, I have reverted to using a *ModelFactory* instance which works from an authoring perspective but doesn't solve the JSON output issue.
> {code:java}
> layoutContainer = modelFactory.getModelFromWrappedRequest(
>     request,
>     request.getResource(),
>     LayoutContainer.class);{code}
> It would be great to get insight into this as I was to be 100% sure Sling is not to blame before raising an issue with Adobe.
> Thanks for your time!



--
This message was sent by Atlassian Jira
(v8.3.4#803005)