Skip to main content
Level 2
Apr 10, 2025 12:53 PM UTC
Solved

AEM - Sling

Hi @16227148,

 

In Adobe Experience Manager (AEM), when defining a Sling Model with the following adaptation:

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

 

What is the purpose of still using the @Self annotation for fields such as:

@Self
private Resource resource;

@Self
private SlingHttpServletRequest request;

How does the @Self annotation interact with the @Model(adaptables) declaration, and what is the significance of using both in a Sling Model?

 

tushaar_srivastava
tushaar_srivastavaAccepted solution
Level 6
Apr 10, 2025 1:28 PM UTC

7 replies

tushaar_srivastava
tushaar_srivastavaAccepted solution
Level 6
Apr 10, 2025 1:28 PM UTC
Level 2
Apr 11, 2025 5:33 AM UTC

@tushaar_srivastava Thank you for sharing such helpful information.

Translate
tushaar_srivastava
Level 6
Apr 11, 2025 6:46 AM UTC

if that information solves your question do mark the above comment as correct reply, so that other can also get benefited!

Thanks for raising this important question

Translate
PRATHYUSHA_VP
Community Advisor
Community Advisor
Apr 10, 2025 2:49 PM UTC
Level 2
Apr 11, 2025 5:34 AM UTC

@prathyusha_vp Thank you for sharing such helpful information.

Translate
Jagadeesh_Prakash
Community Advisor
Community Advisor
Apr 11, 2025 6:31 AM UTC

@yaminikolhe 

 

Great question—this touches on a subtle but important aspect of how Sling Models resolve dependencies using annotations like @Model and @Self.

 

Purpose of @Model(adaptables = { ... })

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

You're telling Sling Models that this class can be instantiated (adapted) from either a Resource or a SlingHttpServletRequest

So when code like this runs:

modelFactory.getModelFromWrappedRequest(request, MyModel.class);

or

resource.adaptTo(MyModel.class);

It will look for a matching adaptable type and attempt to inject the model.

 

What does @Self mean then?

 

The @Self annotation is used on fields or constructor parameters inside the model to inject the same object that was used to adapt the model.

For ex:

@Self
private Resource resource;


Here’s what this does:
- If the model was adapted from a Resource, resource will be injected with that same Resource.
- If the model was adapted from a SlingHttpServletRequest, the framework will try to get a Resource from the request (i.e., request.getResource()) and inject that.

 

Hope this is clear

Translate
Level 2
Apr 11, 2025 6:40 AM UTC

@jagadeesh_prakash Thank you

Translate