Usage of @Via in sling models | Community
Skip to main content
Nitiks25
Level 2
October 11, 2017
Solved

Usage of @Via in sling models

  • October 11, 2017
  • 25 replies
  • 28623 views

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.
Best answer by VeenaVikraman

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
October 13, 2017

I would request some expert advice Jörg HohFeike Visser

rajeevy89244319
Level 3
July 16, 2018

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

smacdonald2008
Level 10
July 16, 2018

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

rajeevy89244319
Level 3
July 16, 2018

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;

}

smacdonald2008
Level 10
July 16, 2018

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

smacdonald2008
Level 10
July 16, 2018

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.

rajeevy89244319
Level 3
July 16, 2018

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.

smacdonald2008
Level 10
July 16, 2018

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.

smacdonald2008
Level 10
July 16, 2018

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

rajeevy89244319
Level 3
July 16, 2018

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