Skip to main content
Nitiks25
Level 2
Oct 11, 2017 5:58 AM UTC
Solved

Usage of @Via in sling models

I understand from the documentation, that @Via is used to inject objects not available through the adaptable mapped to the model

In that case, if my adaptable is Resource.class and I have to inject SlingHttpServletRequset or SlingHttpServletResponse. I will have to use @Inject @Via to fetch it from SlingHttpServletRequest adaptable?

In that case, what is the parameter I have to pass to @Via?

In case of resource, it will be @Via ("resource") - what will it be for slingRequest?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
VeenaVikraman
VeenaVikramanAccepted solution
Community Advisor
Oct 11, 2017 8:25 PM UTC

Nitik,

  Let me try to explain you what I understand here . Let us take the simple example from what documentation Scott has shared

  - So this says ; when the model's adaptable is SlingHttpServletRequest , then when you try to inject getPropertyName() ; it will be return the property via resource method of the SlingHttpServletRequest object "request" like the below

request.getResource().getValueMap().get("propertyName", String.class)

That said , if you check the API SlingHttpServletRequest (Apache Sling Aggregate 5-incubator API)  you can understand that a resource can be fetched from a request , but the vice versa is not possible .

    So basically that means inject the value via resource API in SlingHttpServletRequest API.

  I am not aware of a way to get a request object from a resource and hence I don't believe something like below is even possible

@Model(adaptables=Resource.class)

public class MyModel { 

    @Inject

    @Via("request")

    private String someObj;

}

For further reading the below section explains what all standard types are provided via while and how it is implemented

Apache Sling :: Sling Models

The other thing you can do is to adapt the SlingHttpServletRequest and get the resource from it

@Model(adaptables = SlingHttpServletRequest.class)

public class MyModel {

  

     @Inject

     SlingHttpServletRequest request;

     @PostConstruct

     protected void init() {

         Resource resource = request.getResource() ;

     }

}

25 replies

VeenaVikraman
Community Advisor
Community Advisor
Oct 13, 2017 7:19 PM UTC

I would request some expert advice Jörg Hoh​ Feike Visser​

Translate
rajeevy89244319
Level 3
Jul 16, 2018 2:05 PM UTC

I am trying to follow documentation on Customizing Core Components

// get the default implementation for delegating

@Self @Via(resourceType="core/wcm/components/breadcrumb/v2/breadcrumb", type=ResourceSuperType.class)

When I am trying to use resourceType with @Via, I am getting compilation error saying that resourceType attribute is not supported for @via annotation. Has anyone tried this and can assist me with correct dependencies to use this.

Thanks,

Rajeev

Translate
smacdonald2008
Level 10
Jul 16, 2018 4:11 PM UTC

Where does it state that when customizing Core Components - you can use @Via annotation. I want to follow along.

Translate
rajeevy89244319
Level 3
Jul 16, 2018 5:06 PM UTC

It is in customizing the logic section on Customizing Core Components

Below is code snippet provided:

package com.mysite.components.models;

@Model(adaptables = SlingHttpServletRequest.class,

       adapters = Breadcrumb.class,

       resourceType = "my-site/components/breadcrumb")

public class MyCustomBreadcrumbImpl implements Breadcrumb {

    /* ... */

    // get the default implementation for delegating

    @Self @Via(resourceType="core/wcm/components/breadcrumb/v2/breadcrumb", type=ResourceSuperType.class)

    private Breadcrumb delegate;

}

Translate
smacdonald2008
Level 10
Jul 16, 2018 6:23 PM UTC

OK -- I am going to try to do this.

Translate
smacdonald2008
Level 10
Jul 16, 2018 6:54 PM UTC

Problem with this code example in the AEM Docs is its missing import statements. I am adding them and will post back the version that compiles.

Translate
rajeevy89244319
Level 3
Jul 16, 2018 7:55 PM UTC

I have tried with imports but getting error. For @Via, only type and value attributes are allowed. resourceType is invalid attribute. Not sure if it has to dependency bundle version mismatch.

Translate
smacdonald2008
Level 10
Jul 16, 2018 7:57 PM UTC

Yes - doc example looks wrong for sure. I am workign on this one. I am talking to the consulting team to see if we have a good KB articles on this as well. We will log a bug on the docs as @Via does not support what is shown in the docs.

Translate
smacdonald2008
Level 10
Jul 16, 2018 8:22 PM UTC

I got it compiling with @Via

1st - i created a new Maven 13 Archetype project following this article: Creating an Adobe Experience Manager 6.4 Project using Adobe Maven Archetype 13

2nd added the new class to this project;  (NEVER ADD  A CLASS TO THE CORE COMPONENT PROJECT taken from Github). Always extend from a new AEM Java project. Here is full example:

package com.adobe.community.core.models;

import org.apache.sling.models.annotations.injectorspecific.Self;

import org.apache.sling.models.annotations.Via;

import org.apache.sling.api.resource.Resource;

import org.apache.sling.models.annotations.Default;

import org.apache.sling.models.annotations.Model;

import org.apache.sling.settings.SlingSettingsService;

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.models.annotations.via.ResourceSuperType;

import com.adobe.cq.wcm.core.components.models.Breadcrumb;

@Model(adaptables = SlingHttpServletRequest.class,

       adapters = Breadcrumb.class,

       resourceType = "my-site/components/breadcrumb")

public class MyCustomBreadcrumbImpl implements Breadcrumb {

    /* ... */

    // get the default implementation for delegating

@Self @Via(value="core/wcm/components/breadcrumb/v2/breadcrumb", type=ResourceSuperType.class)

    private Breadcrumb delegate;

}

See:

3rd -add Core Components in POM

<dependency>

        <artifactId>core.wcm.components.core</artifactId>

        <version>2.0.4</version>

        <groupId>com.adobe.cq</groupId>

        <scope>provided</scope>

        </dependency>

(plus the UBER AEM JAR and others discussed in above article)

Finally -- if anyone wants to know more about the @Via annotation - see this Javadoc here - Apache Sling 9 API

Translate
rajeevy89244319
Level 3
Jul 16, 2018 9:00 PM UTC

Thanks Sam. I see.. you changed attribute resourceType to value for @via.. So documentation needs to be updated for correct attribute,

Translate