Какая польза от @Model (adaptables = Resource.class) в моделях Sling? - PullRequest
0 голосов
/ 19 марта 2019

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

1 Ответ

1 голос
/ 20 марта 2019

Эти статьи дают хорошее объяснение:

Первая ссылка отмечает, что

"В некоторых случаях вам может понадобиться получить объект Request внутри модель стропа или вы хотите адаптировать модель стропа с помощью SlingHttpServletRequest объект (где вы не хотите создавать ресурсный объект). "

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

"Многие проекты 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 World\n";

        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;
    }
}
...