#aem #sling-models
#aem #sling-модели
Вопрос:
Какая разница, если я напишу @Model(adaptables=SlingHttpServlet.class)
?
Ответ №1:
В этих статьях даются хорошие пояснения:
- https://helpx.adobe.com/experience-manager/using/sling_model_adaptation.html
- https://sling.apache.org/documentation/bundles/models.html
В первой ссылке отмечается, что
«Существуют варианты использования, когда вам может потребоваться получить объект запроса внутри модели 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;
}
}