Sling Models request object | Community
Skip to main content
Prince_Shivhare
Community Advisor
Community Advisor
April 30, 2021
Solved

Sling Models request object

  • April 30, 2021
  • 3 replies
  • 4575 views

Hi All,

 

I want to use the SlingHttpServletRequest request object in another sling model.

 

For ex.-

 

@Getter
@Model(adaptables = {Resource.class,SlingHttpServletRequest.class}, adapters = Header.class,
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Header{
@SlingObject
Resource componentResource;
@SlingObject
SlingHttpServletRequest servletrequest;
@ValueMapValue
private String fileLarge;
@ChildResource(name = "b2cnavigationItem")
private List<navigation> b2cnavigationItem;
}


@Model(adaptables = {Resource.class,SlingHttpServletRequest.class}, adapters = navigation.class,
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class navigation{
@SlingObject
Resource resource;
@OSGiService
SlingHttpServletRequest request;
@ValueMapValue
String domain;
@Getter
@ValueMapValue
private String navigationText;
@Getter
@ValueMapValue
private String navigationLink;
@ValueMapValue
private String expFragPath;
}

Above is the code, Now  I want to use the request object in "navigation" class. but I am getting Null.

However, I am getting request object in Header Class. but not getting in navigation class.

 

Can anyone help me here? I want to append the Request Url host in the expFragPath variable.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by BrianKasingli

Try removing adaptors:

@Model(adaptables = {Resource.class,SlingHttpServletRequest.class},
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)

@Model(adaptables = {Resource.class,SlingHttpServletRequest.class},
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)

Also sometimes Sling Model injector's annotations can be confusing. During development, if you have this guide opened, it will allow you to accurately write/use annotations without any confusion - https://sourcedcode.com/blog/aem/aem-sling-model-injectors-annotations-reference-guide

 

3 replies

Asutosh_Jena_
Community Advisor
Community Advisor
April 30, 2021

Hi @prince_shivhare 

 

I see in Navigation model you are using @Reference whereas you should be using it as @SlingObject. Also you need to remove the adapters which is not required.

@SlingObject
SlingHttpServletRequest request;

This should resolve the issue.

 

Thanks! 

Prince_Shivhare
Community Advisor
Community Advisor
April 30, 2021
Nope, that is also not working.
BrianKasingli
Community Advisor and Adobe Champion
BrianKasingliCommunity Advisor and Adobe ChampionAccepted solution
Community Advisor and Adobe Champion
May 3, 2021

Try removing adaptors:

@Model(adaptables = {Resource.class,SlingHttpServletRequest.class},
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)

@Model(adaptables = {Resource.class,SlingHttpServletRequest.class},
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)

Also sometimes Sling Model injector's annotations can be confusing. During development, if you have this guide opened, it will allow you to accurately write/use annotations without any confusion - https://sourcedcode.com/blog/aem/aem-sling-model-injectors-annotations-reference-guide

 

Prince_Shivhare
Community Advisor
Community Advisor
May 4, 2021
Not working Mate, I resolved my issue with different approach.
Vijayalakshmi_S
Level 10
May 4, 2021

Hi @prince_shivhare,

When injecting a resource as @ChildResource(In this case, Navigation), it loses the context of SlingHttpServletRequest and hence the same is null in resulting/its respective Model.

To overcome this, we have annotation named @ChildResourceFromRequest from ACS commons - https://adobe-consulting-services.github.io/acs-aem-commons/features/sling-model-injectors/child-resource-from-request/index.html

 

Use @ChildResourceFromRequest (com.adobe.acs.commons.models.injectors.annotation.ChildResourceFromRequest) instead of @ChildResource in Header Model + SlingHttpServletRequest in Navigation Model using @SlingObject or using @Self. 

 

ACS commons maven dependency details are available here - https://adobe-consulting-services.github.io/acs-aem-commons/pages/maven.html

Prince_Shivhare
Community Advisor
Community Advisor
May 4, 2021
Thanks but tried that too and it is not working. however I have resolved my issue using the JS.
Level 3
November 4, 2022

@prince_shivhare  Replace @OSGIService annotation in navigation with @SlingObject, remove adapter in both models, use only SlingHttpServletRequest.class as adaptable in both models, it should resolve your issue.