How do I create a Sling model using both a Resource and SlingHttpServletRequest?

Avatar

Avatar

jkpanera

Avatar

jkpanera

jkpanera

02-07-2019

Hey guys,

I need to initialize a sling model for component B from inside component A. I have access to a sling Resource object for component B and a SlingHttpServletRequest for component A.

So I can easily do:

ComponentB componentB = resourceForComponentB.adaptTo(ComponentB.class);

But the @PostConstruct initializer for ComponentB uses a SlingHttpServletRequest (up until now, it had only been adapted via request). How do I initialize the @SlingObject request so that the @PostConstruct for ComponentB will be able to execute (without a null pointer exception).

Thanks!

Accepted Solutions (1)

Accepted Solutions (1)

Avatar

Avatar

antoniom5495929

Avatar

antoniom5495929

antoniom5495929

03-07-2019

Hi,

I think that you just need to define an adapter strategy like the following snippet:

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

Thanks,

Antonio

Answers (4)

Answers (4)

Avatar

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

996

Correct Reply

1.0K

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

996

Correct Reply

1.0K
Jörg_Hoh
Employee

03-07-2019

If you want to adapt a SlingModel from both Request and Resource, make sure that you don't use data from the request, but only from the resource.

Because in both cases, the Resource is always present (in case of the request: request.getResource()), and just relying on that gives the model the most flexibility.

Jörg

Avatar

Avatar

jkpanera

Avatar

jkpanera

jkpanera

03-07-2019

I did that. I managed to get done what I needed by refactoring the initialization but I was wondering if there was a way to initialize using both the request and the resource. I guess there isn't.

Thanks!

Avatar

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

996

Correct Reply

1.0K

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

996

Correct Reply

1.0K
Jörg_Hoh
Employee

02-07-2019

You can't.

In the case you mentioned it's actually the programmer's fault to let the model declare that the model can be initialized by a resource only if a proper Request object is required to make the @PostConstruct work.

Avatar

Avatar

Arun_Patidar

MVP

Total Posts

3.0K

Likes

1.1K

Correct Reply

861

Avatar

Arun_Patidar

MVP

Total Posts

3.0K

Likes

1.1K

Correct Reply

861
Arun_Patidar
MVP

02-07-2019