[
https://issues.apache.org/jira/browse/SLING-10738?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Chris Shaw updated SLING-10738:
-------------------------------
Description:
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.class {
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.class {
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!
was:
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 {
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 {
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!
> 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.class {
> 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.class {
> 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)