【发布时间】:2019-03-19 16:17:05
【问题描述】:
如果我写会有什么不同
@Model(adaptables=SlingHttpServlet.class)?
【问题讨论】:
标签: aem sling-models
如果我写会有什么不同
@Model(adaptables=SlingHttpServlet.class)?
【问题讨论】:
标签: aem sling-models
这些文章给出了很好的解释:
第一个链接说明
"在某些用例中,您可能需要在其中获取 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;
}
}
【讨论】: