Expand my Community achievements bar.

SOLVED

Problem with @inject annotation in a sling model

Avatar

Level 2

Hi everyone,

I have a issue with @inject annotation, I try to inject the Resource object inside a Sling Model, but when I debug the code it's null.

This is part of my code:


import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.models.annotations.Default;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Optional;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.servlet.jsp.PageContext;

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

public class ProductFilter extends AbstractComponent {

   @Inject
   private Resource  resource;

Could someone help me with this issue?

1 Accepted Solution

Avatar

Correct answer by
Level 2

I found a solution to my problem, it was related with de Sling Models Injectors.

The solution was install the ACS Commons content package from here:
Adobe AEM Commons

This package add a new in injector into AEM, and this inject the Resource Object into the sling model.

1381663_pastedImage_3.png
Thank you for your answers, they were useful to fix another parts of my sling model.

0 Replies

Avatar

Level 10

What is that lining up with.

See this article that shows you how to inject a Multifield dialog.

Adobe Experience Manager Help | Creating a HTL Repeating Data Set 6.3 Component that uses Sling Mode...

When you use Sling Models - you need to make sure you are referencing a valid resource like a dialog node.

Avatar

Employee Advisor

Hi,

I am not a great Sling Models developer, but I would expect a @Self annotation:

@Self

Resource resource;

Avatar

Employee

Why do you have two adapters ({ Resource.class, SlingHttpServletRequest.class })

One is simpler and easier to debug.

Avatar

Level 2

Feike Visser I leave only one adaptable and

smacdonald2008 i insert the @optional annotation and I change de javax.inject dependency with this dependency:

<dependency>

               <groupId>org.apache.geronimo.specs</groupId>

               <artifactId>geronimo-atinject_1.0_spec</artifactId>

               <version>1.0</version>

               <scope>provided</scope>

           </dependency>

But nothing works, the Resource propertie is still null.

On the other hand, if I made the Inject with a constructor it´s work well.

Like this:

But i need to know why @Inject annotation is not working.

There is something else to try?

Avatar

Level 10

Your Resource is not pointing to a valid AEM Resource. You must make sure that you are referencing something in the JCR to which the model binds to.

In our Multifield example here- the model binds to the products node in the dialog that represents the Multi-field node.

@Model(adaptables = Resource.class)

public class Multifield {

    // Inject the products node under the current node

    @Inject

    @Optional

    public Resource products;

    // No need of a post construct as we don't have anything to modify after the

    // model is constructed

}

Adobe Experience Manager Help | Creating a HTL Repeating Data Set 6.3 Component that uses Sling Mode...

In another example - we are using a Resource that we obtained:

resolver = resolverFactory.getServiceResourceResolver(param);

Resource resource = resolver.getResource("/content/testsling/slingmodel");

See how we have valid Resource. Now the Sling Model is bound to a valid JCR Resource and it works.

See this artilce - the only difference is front end is JSP.

Adobe Experience Manager Help | Creating Adobe Experience Manager 6.3 Sling Model Components

THis will point you in the correct direction.

Also - take note in this example - we are creating a system user, providing the correct permission and then use Sling Mapping service (which is the proper way now to get a ResourceResolver).

Hope this helps....

          

Avatar

Level 2

Hi @smacldonald2008


When i use the injection by constructor i can see that t's pointing to the node that containt the component that use the sling model, i think that it's pointing well.


Debug screen:

1378335_pastedImage_0.png1378336_pastedImage_1.png

You will have to made zoom with the explorer, because this editor reduce the image size.

is the path well or i'm wrong?

Thanks!!

Avatar

Level 6

Thats correct resource path will be exactly where current component is used.

To get page I always prefer PageManager and resourceResolver

  page = resourceResolver.adaptTo(PageManager.class).getContainingPage(resource);

@Inject @Source("sling-object")
  private ResourceResolver resourceResolver;

This is because the present condition you are using may fail when you drop in other place.

Avatar

Correct answer by
Level 2

I found a solution to my problem, it was related with de Sling Models Injectors.

The solution was install the ACS Commons content package from here:
Adobe AEM Commons

This package add a new in injector into AEM, and this inject the Resource Object into the sling model.

1381663_pastedImage_3.png
Thank you for your answers, they were useful to fix another parts of my sling model.

Avatar

Level 1

use

@SlingObject
private Resource resource; 
page footer