


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?
leopor
leopor
27-12-2017
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.
Thank you for your answers, they were useful to fix another parts of my sling model.
GiurgiuRubin
GiurgiuRubin
14-10-2020
use
@SlingObject
private Resource resource;
mjb54261515
mjb54261515
21-12-2017
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);
|
This is because the present condition you are using may fail when you drop in other place.
leopor
leopor
21-12-2017
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:
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!!
smacdonald2008
smacdonald2008
21-12-2017
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
}
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....
leopor
leopor
21-12-2017
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?
Feike_Visser1
Employee
Feike_Visser1
Employee
20-12-2017
Why do you have two adapters ({ Resource.class, SlingHttpServletRequest.class })
One is simpler and easier to debug.
mjb54261515
mjb54261515
19-12-2017
@Self | |
private Resource resource; |
Should work
ref:acs-aem-samples/SampleSlingModel.java at master · Adobe-Consulting-Services/acs-aem-samples · GitHub
Jörg_Hoh
Employee
Jörg_Hoh
Employee
19-12-2017
Hi,
I am not a great Sling Models developer, but I would expect a @Self annotation:
@Self
Resource resource;
smacdonald2008
smacdonald2008
19-12-2017
What is that lining up with.
See this article that shows you how to inject a Multifield dialog.
When you use Sling Models - you need to make sure you are referencing a valid resource like a dialog node.