Expand my Community achievements bar.

Dive into Adobe Summit 2024! Explore curated list of AEM sessions & labs, register, connect with experts, ask questions, engage, and share insights. Don't miss the excitement.

Dynamic injection of values into sling model is not working

Avatar

Level 2

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;

  }

}

6 Replies

Avatar

Level 10

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?

Avatar

Level 2

in HTL i used list navigation as below

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

Avatar

Level 1

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;

Avatar

Level 10

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.

Avatar

Level 1

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;