Expand my Community achievements bar.

SOLVED

Sling Models request object

Avatar

Community Advisor

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.

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

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

 

View solution in original post

8 Replies

Avatar

Community Advisor

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! 

Avatar

Correct answer by
Community Advisor

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

 

Avatar

Community Advisor
Not working Mate, I resolved my issue with different approach.

Avatar

Community Advisor
Wondering Prince, good to hear. Can you share your solution in this thread?

Avatar

Community Advisor

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-res...

 

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

Avatar

Community Advisor
Thanks but tried that too and it is not working. however I have resolved my issue using the JS.

Avatar

Level 4

@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.