在父节点吊索模型中获取基础组件 属性
Get foundation component property in parent node sling model
我刚开始使用 Sling 模型,但在父模型中检索子节点 属性 时遇到问题。
Here is my JCR structure
图像节点来自基础组件。
我的目标是在 Topbanner 节点中获取图像组件的 "filerefernce" 属性,然后在其可见的脚本中。
这是我的 topbanner 节点模型:
@Model(adaptables=Resource.class)
public class TopBanner {
@Self @Via("resource")
private Resource bannerBackGroundImage;
private String bannerBgImagePath;
// @Inject
// private String bannerTitle;
// @Inject
// private String bannerDescription;
//
// @Inject
// private String bannerButtonText;
//
// @Inject
// private String bannerButtonLink;
@SlingObject
private ResourceResolver resourceResolver;
@PostConstruct
public void init() {
TopBanner.LOG.info("we are here");
try {
bannerBackGroundImage=resourceResolver.getResource("/apps/ads/components/structure/TopBanner2/Image");
this.bannerBgImagePath=bannerBackGroundImage.adaptTo(ValueMap.class).get("fileReference",String.class);
} catch(SlingException e) {
TopBanner.LOG.info("Error message **** " + e.getMessage());
}
}
// getters omitted
我得到的错误是
标识符 Mypackage.models.TopBanner 无法通过 Use API
正确实例化
如果您的目标是获得 'fileReference' 试试这个:
@Self
private SlingHttpServletRequest request;
@ValueMapValue(name = DownloadResource.PN_REFERENCE, injectionStrategy = InjectionStrategy.OPTIONAL)
private String fileReference;
然后让我们的资产使用如下:
if (StringUtils.isNotEmpty(fileReference)) {
// the image is coming from DAM
final Resource assetResource = request.getResourceResolver().getResource(fileReference);
if (assetResource != null) {
Asset asset = assetResource.adaptTo(Asset.class);
//Work with your asset there.
}
}
也添加到您的 class 注释中:
@Model(adaptables = { SlingHttpServletRequest.class })
使用@ChildResource
注释
@ChildResource
@Named("image") //Child node name
private Resource childResource;
private String imagePath;
public String getImagePath() {
return imagePath;
}
@PostConstruct
public void init() {
imagePath = childResource.getValueMap().get("fileReference", String.class);
}
使用
检索Sightly/HTL标记中的图像路径
<div data-sly-use.model="package.name.TopBanner">
<img src="${model.imagePath}"/>
</div>
根据 Sling documentation 文档的另一种方法是使用 @Via
注释,因为 Sling 模型 API 1.3.4.
文档中的示例,
@Model(adaptables=Resource.class)
public interface MyModel {
// will return resource.getChild("jcr:content").getValueMap().get("propertyName", String.class)
@Inject @Via(value = "jcr:content", type = ChildResource.class)
String getPropertyName();
}
我刚开始使用 Sling 模型,但在父模型中检索子节点 属性 时遇到问题。 Here is my JCR structure
图像节点来自基础组件。 我的目标是在 Topbanner 节点中获取图像组件的 "filerefernce" 属性,然后在其可见的脚本中。 这是我的 topbanner 节点模型:
@Model(adaptables=Resource.class)
public class TopBanner {
@Self @Via("resource")
private Resource bannerBackGroundImage;
private String bannerBgImagePath;
// @Inject
// private String bannerTitle;
// @Inject
// private String bannerDescription;
//
// @Inject
// private String bannerButtonText;
//
// @Inject
// private String bannerButtonLink;
@SlingObject
private ResourceResolver resourceResolver;
@PostConstruct
public void init() {
TopBanner.LOG.info("we are here");
try {
bannerBackGroundImage=resourceResolver.getResource("/apps/ads/components/structure/TopBanner2/Image");
this.bannerBgImagePath=bannerBackGroundImage.adaptTo(ValueMap.class).get("fileReference",String.class);
} catch(SlingException e) {
TopBanner.LOG.info("Error message **** " + e.getMessage());
}
}
// getters omitted
我得到的错误是 标识符 Mypackage.models.TopBanner 无法通过 Use API
正确实例化如果您的目标是获得 'fileReference' 试试这个:
@Self
private SlingHttpServletRequest request;
@ValueMapValue(name = DownloadResource.PN_REFERENCE, injectionStrategy = InjectionStrategy.OPTIONAL)
private String fileReference;
然后让我们的资产使用如下:
if (StringUtils.isNotEmpty(fileReference)) {
// the image is coming from DAM
final Resource assetResource = request.getResourceResolver().getResource(fileReference);
if (assetResource != null) {
Asset asset = assetResource.adaptTo(Asset.class);
//Work with your asset there.
}
}
也添加到您的 class 注释中:
@Model(adaptables = { SlingHttpServletRequest.class })
使用@ChildResource
注释
@ChildResource
@Named("image") //Child node name
private Resource childResource;
private String imagePath;
public String getImagePath() {
return imagePath;
}
@PostConstruct
public void init() {
imagePath = childResource.getValueMap().get("fileReference", String.class);
}
使用
检索Sightly/HTL标记中的图像路径<div data-sly-use.model="package.name.TopBanner">
<img src="${model.imagePath}"/>
</div>
根据 Sling documentation 文档的另一种方法是使用 @Via
注释,因为 Sling 模型 API 1.3.4.
文档中的示例,
@Model(adaptables=Resource.class)
public interface MyModel {
// will return resource.getChild("jcr:content").getValueMap().get("propertyName", String.class)
@Inject @Via(value = "jcr:content", type = ChildResource.class)
String getPropertyName();
}