SlingModel @ChildResource is not working

Avatar

Avatar
Give Back
Level 2
vijays80591732
Level 2

Likes

6 likes

Total Posts

56 posts

Correct reply

4 solutions
Top badges earned
Give Back
Ignite 1
Validate 1
Boost 5
Boost 3
View profile

Avatar
Give Back
Level 2
vijays80591732
Level 2

Likes

6 likes

Total Posts

56 posts

Correct reply

4 solutions
Top badges earned
Give Back
Ignite 1
Validate 1
Boost 5
Boost 3
View profile
vijays80591732
Level 2

27-07-2020

Hi All,

 

I have a node called "entries" under the page. The "entries" node having some child nodes like entry1, entry2, entry3. The "entries" and child nodes "entry1" have been creating via code and I don't have any component for this. Now, I'm trying to access the "entries" node in a sling model but it's not working. Below is the screenshot of the node structure,

 

Screenshot 2020-07-28 at 12.08.19 PM.png

 

Below is the code,

 

    @Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class HistoryModel {

private static final Logger LOGGER = LoggerFactory.getLogger(HistoryModel.class);

@Self
private Resource currentResource;

/*@ChildResource(name = "entries")
private List<HistoryBean> entries;
*/
@ChildResource(name = "entries")
private Resource entries;

@ChildResource(name="entries",injectionStrategy= InjectionStrategy.OPTIONAL,via = "resource")
Resource child;

public Resource getEntries() {
return entries;
}

public Resource getChild() {
return child;
}

@PostConstruct
protected void postConstruct() {
//Nothing inside
LOGGER.debug("HistoryModel post construct Method().. calling..");
LOGGER.debug("HistoryModel entries.. calling..{}", entries);
LOGGER.debug("HistoryModel child.. calling..{}", child);

}

Tried with @childResource. In the log, I'm getting null. anything wrong in the code? Can anyone help?

 

@arunpatidar26 @smacdonald2008 @arunpatidar26 @Ratna_Kumar @kautuk_sahni @wimsymons @cqsapientu69896 @vanegi @Veena_Vikram @varuns7990 @Theo_Pendle

 

Thanks,

Vijay

Accepted Solutions (1)

Accepted Solutions (1)

Avatar

Avatar
Boost 250
MVP
ChitraMadan
MVP

Likes

273 likes

Total Posts

165 posts

Correct reply

67 solutions
Top badges earned
Boost 250
Establish
Ignite 1
Give Back 5
Give Back 3
View profile

Avatar
Boost 250
MVP
ChitraMadan
MVP

Likes

273 likes

Total Posts

165 posts

Correct reply

67 solutions
Top badges earned
Boost 250
Establish
Ignite 1
Give Back 5
Give Back 3
View profile
ChitraMadan
MVP

28-07-2020

Hi @vijays80591732 ,

 

If this is not a component and you want to access it in Sling Model, then you can make use of a java class to read its child values and return in Sling Model in this way:

 

@Getter
@Setter
@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class HistoryModel {

@Inject
private List<WorkflowItem> workflowItems;

@Self
private transient Resource resource;

@PostConstruct
private void init() {
workflowItems = SomeUtilClass.getWorkflowItems(resource, "path to entries node");
}
}
 
And your Util Class method can have this code:
List<WorkflowItem>workflowItemsList = Collections.emptyList();
Resource workflowResource = resource.getResourceResolver().getResource("path to entries");
if (workflowResource != null && workflowResource.hasChildren()) {
workflowItemsList =
Lists.newArrayList(workflowResource.getChildren()).stream()
.map(child -> child.adaptTo(WorkflowItem.class))
.collect(Collectors.toList());
return workflowItemsList;
}
 
WorkflowItem class can be another Model class with Description and Message and other attributes as per your need.

Answers (1)

Answers (1)

Avatar

Avatar
Seeker
MVP
Suraj_Kamdi
MVP

Likes

148 likes

Total Posts

162 posts

Correct reply

42 solutions
Top badges earned
Seeker
Bedrock
Engage 1
Springboard
Validate 1
View profile

Avatar
Seeker
MVP
Suraj_Kamdi
MVP

Likes

148 likes

Total Posts

162 posts

Correct reply

42 solutions
Top badges earned
Seeker
Bedrock
Engage 1
Springboard
Validate 1
View profile
Suraj_Kamdi
MVP

28-07-2020

@vijays80591732 

try with 

@ChildResource(injectionStrategy = InjectionStrategy.OPTIONAL)

Collection<Resource> entries

 

Hope this will help