Sling模型中@Model(adaptables = Resource.class)的用途是什么?

时间:2019-03-19 16:17:06

标签: aem sling-models

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

1 个答案:

答案 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;
    }
}