Highlighted

Dynamic injection of values into sling model is not working

Avatar

Avatar

krishc76025392

Avatar

krishc76025392

krishc76025392

25-04-2019

Hi All,

i am trying to inject some values dynamically into sling model and retrieve some properties of that injected value and print them as below which is not working and throwing a null pointer exception which is not appropriate.

i can see sling model is registered in adapters.

some one please tell me where it went wrong.

Any help is highly appreciated.

In below i want to send each item of list dynamically to sling model via "selectPath" and process the valur for a property in sling model and retrieve in "flags.flagicon"

my sightly html:

<select class="list-selector__dropdown language-change" title="languages" data-sly-list.item="${listNavigation.items}">

            <sly data-sly-use.flags="${'com.krish.chopps.modules.sling.models.listselector.ListSelectorModel' @ selectPath='${item.path}' }">

              <option value="${item.language}">${item.title}, ${flags.flagicon}</option>

        </select>

          </sly>

My Sling model:

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

public class ListSelectorModel {

   private static final Logger logger = LoggerFactory.getLogger(ListSelectorModel.class);

   @RequestAttribute
  @Optional
   private String selectPath;

   @SlingObject
   private ResourceResolver resolver;

   public String getFlagicon() {

   return flagicon;

  }

   private String flagicon;

   @PostConstruct
   public void init() {

   if (selectPath != null) {

   flagicon = getNodeValue(selectPath, "countryFlag");

  }

  }

   private String getNodeValue(String parentPage, String property) {

   logger.info("parentpage is "+ parentPage);

  Resource resource = resolver.getResource(parentPage + "/jcr:content");

  Node node = resource.adaptTo(Node.class);

  String image = null;

   try {

   if (node != null && node.hasProperty(property)) {

  image = node.getProperty(property).getString();

  }

  } catch (RepositoryException e) {

   logger.info("Exception in node values : {}", e);

  }

   return image;

  }

}

Replies

Highlighted

Avatar

Avatar

Gaurav-Behl

MVP

Total Posts

1.1K

Likes

226

Correct Answer

281

Avatar

Gaurav-Behl

MVP

Total Posts

1.1K

Likes

226

Correct Answer

281
Gaurav-Behl
MVP

25-04-2019

What does 'listNavigation' object maps to in the HTL script?

Did you print/debug in model object to validate the image object?

Not sure why you don't prefer to use the 'self' annotation/object to get the data?

Highlighted

Avatar

Avatar

krishc76025392

Avatar

krishc76025392

krishc76025392

25-04-2019

in HTL i used list navigation as below

<sly data-sly-use.listNavigation="com.adobe.cq.wcm.core.components.models.LanguageNavigation"></sly>

Highlighted

Avatar

Avatar

Gaurav-Behl

MVP

Total Posts

1.1K

Likes

226

Correct Answer

281

Avatar

Gaurav-Behl

MVP

Total Posts

1.1K

Likes

226

Correct Answer

281
Gaurav-Behl
MVP

25-04-2019

Highlighted

Avatar

Avatar

reshmabegum

Avatar

reshmabegum

reshmabegum

25-04-2019

Use @Inject instead of @RequestAttribute

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

public class ListSelectorModel {

   private static final Logger logger = LoggerFactory.getLogger(ListSelectorModel.class);

   @Inject
  @Optional
   private String selectPath;

Highlighted

Avatar

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Answer

2.3K

Avatar

smacdonald2008

Total Posts

12.7K

Likes

1.4K

Correct Answer

2.3K
smacdonald2008

25-04-2019

We cover how to work with Sling Models and Show HOW TO inject values here:

Building Experience Manager 6.5 Components using Granite/Coral Resource Types

I recommend going through this entire document to learn how to develop AEM Components - including working with Multifield.

Highlighted

Avatar

Avatar

reshmabegum

Avatar

reshmabegum

reshmabegum

25-04-2019

Use below syntax

<sly data-sly-use.flags="${'com.krish.chopps.modules.sling.models.listselector.ListSelectorModel' @ selectPath=item.path }">

and

Use @Inject instead of @RequestAttribute

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

public class ListSelectorModel {

   private static final Logger logger = LoggerFactory.getLogger(ListSelectorModel.class);

   @Inject
  @Optional
   private String selectPath;