2017年,Apache Sling 和 HTL 添加了功能,以允许将 Use API与不同的自适应(例如资源解析器或子资源)一起使用,而不是默认的支持资源或请求。
Feike Visser通过一个简单的列表提供了一个如何使用这种灵活适配器的示例:
<div data-sly-list.child="${resource.listChildren}">
<sly data-sly-use.c="${'com.adobe.examples.htl.core.models.HelloWorldModel' @ adaptable=child}" />
${c.resourceType}
</div>
但是,该示例似乎不起作用(在这种情况下,使用非 AEM Sling 11)。在HelloWorldModel
实例化(Sling 模型)时,支持资源始终是原始页面,而不是指定的可适应页面。因为它的adaptable=child
部分被忽略了。
是什么阻止了这个有用的功能?
编辑:HelloWorldModel
基于 Visser 的示例:
@Model(adaptables=Resource.class)
public class HelloWorldModel {
private static Logger log = LoggerFactory.getLogger(HelloWorldModel.class);
@OSGiService
private SlingSettingsService settings;
@SlingObject
private ResourceResolver resourceResolver;
@ValueMapValue(name = "sling:resourceType", injectionStrategy=InjectionStrategy.OPTIONAL) @Default(values="No resourceType")
private String resourceType;
private String message;
@PostConstruct
public void init() {
log.info("Reached init of HelloWorldModel");
message = "\tHello World!\n";
message += "\tResource type is: " + resourceType + "\n";
message += "\tUser id is " + resourceResolver.getUserID() + "\n";
}
public String getResourceType() {
return resourceType;
}
public String getMessage() {
log.info("Inside getMessage() method");
return message;
}
}
输出始终是页面资源的资源类型,而不是列表子项的资源类型。
编辑:这可能是因为在SlingModelsUseProvider
之前使用了JavaUseProvider
,这意味着JavaUseProvider
- 提供灵活的适应 - 从未达到?