Какая польза от @Model (адаптируемые файлы = Resource.class ) в моделях Sling?

#aem #sling-models

#aem #sling-модели

Вопрос:

Какая разница, если я напишу @Model(adaptables=SlingHttpServlet.class) ?

Ответ №1:

В этих статьях даются хорошие пояснения:

В первой ссылке отмечается, что

«Существуют варианты использования, когда вам может потребоваться получить объект запроса внутри модели Sling или вы хотите адаптировать свою модель Sling с помощью объекта SlingHttpServletRequest (где вы не хотите создавать объект resource)».

Во второй ссылке упоминается

«Многие проекты Sling хотят иметь возможность создавать объекты модели — POJO, которые автоматически сопоставляются с объектами Sling, обычно ресурсами, но также и объектами запроса. Иногда этим POJO также требуются службы OSGi.»

Итак, используете ли вы один адаптируемый файл или другой (или оба сразу), зависит от того, что вам нужно в вашей модели. В этом примере создается модель, которой необходимо считывать некоторые значения из ресурса, а другие — из запроса, поэтому используемый вами адаптируемый формат зависит от того, какие значения вам нужны в вашей модели. Вот пример класса по этой первой ссылке, который показывает «сообщение», которому требуются данные из ресурса (имя и фамилия) и данные из запроса (путь):

 package com.aem.core.models;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Via;
import org.apache.sling.models.annotations.injectorspecific.SlingObject;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class AdaptationModel { 

    Logger logger = LoggerFactory.getLogger(this.getClass());

    private String message;

    @SlingObject
    private SlingHttpServletRequest request;

    @Inject @Via("resource")
    private String firstName;

    @Inject  @Via("resource")
    private String lastName;

    @PostConstruct
    protected void init() {

        message = "Hello Worldn";

        if (request != null) {
            this.message  = "Request Path: " request.getRequestPathInfo().getResourcePath() "n";
        }

        message  = "First Name: "  firstName  " n";
        message  = "Last Name: "  lastName   "n";

        logger.info("inside post construct");
    }

    public String getMessage() {
        return message;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}