Получить свойство компонента фундамента в модели стропа родительского узла - PullRequest
0 голосов
/ 05 сентября 2018

Я только начал использовать модели Sling, и у меня возникла проблема с получением свойства дочернего узла в родительской модели. Вот моя структура JCR

узел изображения из компонентов фундамента. и моя цель состоит в том, чтобы получить свойство filerefernce компонента изображения в узле Topbanner, затем в его визуальном скрипте. вот моя модель узла 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 не может быть правильно создан API-интерфейсом использования

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Использование @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);
  }

Получите imagePath в разметке Sightly / HTL, используя

<div data-sly-use.model="package.name.TopBanner">
  <img src="${model.imagePath}"/>
</div>

Другой способ согласно документации Sling docs использует аннотацию @Via, поскольку API модели Sling 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();

}
0 голосов
/ 05 сентября 2018

Если ваша цель - получить 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.
        }
    }

также добавьте к аннотации вашего класса:

@Model(adaptables = { SlingHttpServletRequest.class })
...