如果我写的话会有什么不同
@Model(adaptables=SlingHttpServlet.class)
?
答案 0 :(得分:1)
这些文章给出了很好的解释:
第一个链接指出
“在某些情况下,您可能需要在其中获取一个Request对象 Sling模型,或者您想使用 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;
}
}