Sling模型是Apache Sling提供的一种基于注解的模型框架,用于将资源属性映射到Java对象。在AEM中,它提供了一种类型安全的方式来访问JCR节点属性。
首先确保项目中包含Sling模型依赖:
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.models.api</artifactId>
<version>1.3.0</version>
<scope>provided</scope>
</dependency>
package com.example.models;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Optional;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;
@Model(adaptables = Resource.class)
public interface PageModel {
@ValueMapValue(name = "jcr:title")
String getTitle();
@ValueMapValue
@Optional
String getDescription();
@ValueMapValue(name = "jcr:created")
String getCreatedDate();
// 其他需要的页面属性...
}
<sly data-sly-use.pageModel="com.example.models.PageModel">
<h1>${pageModel.title}</h1>
<p>${pageModel.description}</p>
<p>Created on: ${pageModel.createdDate}</p>
</sly>
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.factory.ModelFactory;
import com.example.models.PageModel;
// 获取当前页面的资源
Resource pageResource = request.getResourceResolver().getResource("/content/mysite/mypage");
// 通过ModelFactory获取模型
ModelFactory modelFactory = getService(ModelFactory.class);
PageModel pageModel = modelFactory.createModel(pageResource, PageModel.class);
// 使用属性
String title = pageModel.getTitle();
原因:可能是缺少必要的注解或依赖 解决:
原因:可能是在错误的资源级别上使用模型 解决:
/content/...
)ResourceResolver.getResource()
获取正确的资源如果需要处理特殊类型的属性或执行转换:
@Model(adaptables = Resource.class)
public class CustomPageModel {
@ValueMapValue
private String[] tags;
public String getTagsAsString() {
return String.join(", ", tags);
}
}
@Optional
注解处理可选属性@Default
注解提供默认值@ChildResource
或@Self
注解通过Sling模型获取页面属性是AEM开发中的推荐做法,它提供了比直接访问JCR API更简洁、更安全的方式。