Delegation Pattern for Sling Models returns null object | Community
Skip to main content
TarunKumar
Community Advisor
Community Advisor
November 12, 2021

Delegation Pattern for Sling Models returns null object

  • November 12, 2021
  • 1 reply
  • 3803 views

I am trying to delegate core navigation component for my proxy navigation component. I have used below code snippet for that purpose in my sling model class.

@1961677
@2434638(type = ResourceSuperType.class)
private Navigation nav;

 

But  this type of injection is providing null object when creating model object using modelfactory. Any suggestion would be helpful.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

1 reply

TarunKumar
Community Advisor
Community Advisor
November 12, 2021

HI @asutosh_jena_ 

I have followed the same approach as mentioned the article provided by you. However, I am facing issue when I am trying to instantiate my custom model class using below line of codes:

NavigationCustomModel navigation= resource.adaptTo(NavigationCustomModel.class);

Above returns navigation as null.

MohitKumarK
Level 3
November 16, 2021

Hi @mohitkumark 

Please find the model class code snippet that I am using:

@Model(adaptables = { SlingHttpServletRequest.class}, adapters = {ComponentExporter.class,Navigation.class,NavigationCustomModel.class },
resourceType = "myproject/components/content/navigation", defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
@Exporter(name = "gson", extensions = ExporterConstants.SLING_MODEL_EXTENSION)
public class NavigationCustomModel implements Navigation {

private static final Logger LOGGER = LoggerFactory.getLogger(NavigationCustomModel.class);
private static final String PN_ACCESSIBILITY_LABEL = "accessibilityLabel";

 

@Self
private SlingHttpServletRequest request;


@Self
@Via(type = ResourceSuperType.class)
@Delegate(excludes = DelegationExclusion.class)
private Navigation navigation;

/**
* The current page.
*/
@ScriptVariable
private Page currentPage;

/**
* The current style.
*/
@ScriptVariable
private Style currentStyle;

/**
* The language manager service.
*/
@OSGiService
private LanguageManager languageManager;

/**
* The relationship manager service.
*/
@OSGiService
private LiveRelationshipManager relationshipManager;

/**
* The accessibility label.
*/

private String accessibilityLabel;


@Inject
private Resource resource;


@JsonIgnore
private List<NavigationItem> items;


static final String PN_DISABLE_SHADOWING = "disableShadowing";

/**
* Initialize the model.
*/
@PostConstruct
private void initModel() {
ValueMap properties = this.resource.getValueMap();
items = getItems();
}

 

@Override
public List<NavigationItem> getItems() {
return nav.getItems();
}

@Override
public String getAccessibilityLabel() {
if (this.accessibilityLabel == null) {
this.accessibilityLabel = this.resource.getValueMap().get(PN_ACCESSIBILITY_LABEL, String.class);
}
return this.accessibilityLabel;
}

And in servlet I am trying to initiate the object of this model class using adapt to but I am getting null value.:-

Resource resource = req.getResourceResolver().getResource("/content/hq/en/testpage");
NavigationCustomModel navigation = resource.adaptTo(NavigationCustomModel.class);


Hi @tarunkumar ,

As per your sling model, you are extending for navigation component. But you are trying to adapt a page as your navigation model. May be thats the reason you are getting null. Try to adapt a resource which is of type (myproject/components/content/navigation).

Remember this navigation component should extend (sling:resourceSuperType) as core navigation component.

Thanks!