如果我写会有什么不同
@Model(adaptables=SlingHttpServlet.class)
?
问问题
6129 次
1 回答
6
这些文章给出了很好的解释:
- https://helpx.adobe.com/experience-manager/using/sling_model_adaptation.html
- https://sling.apache.org/documentation/bundles/models.html
第一个链接指出
“在某些用例中,您可能需要在 Sling 模型中获取请求对象,或者您想使用 SlingHttpServletRequest 对象(您不想创建资源对象)来调整您的 Sling 模型。”
第二个链接提到
“许多 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;
}
}
于 2019-03-19T23:31:18.407 回答