0

如果我写会有什么不同 @Model(adaptables=SlingHttpServlet.class)

4

1 回答 1

6

这些文章给出了很好的解释:

第一个链接指出

“在某些用例中,您可能需要在 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 回答