Expand my Community achievements bar.

Adobe Summit 2025: AEM Session Recordings Are Live! Missed a session or want to revisit your favorites? Watch the latest recordings now.
SOLVED

AEM - Sling

Avatar

Level 1

Hi @everyone,

 

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?

 

1 Accepted Solution

Avatar

Correct answer by
Level 7
7 Replies

Avatar

Correct answer by
Level 7

Avatar

Level 1

@tushaar_srivastava Thank you for sharing such helpful information.

Avatar

Level 7

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

Avatar

Community Advisor

Avatar

Level 1

@PRATHYUSHA_VP Thank you for sharing such helpful information.

Avatar

Community Advisor

@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

Avatar

Level 1

@Jagadeesh_Prakash Thank you