Как получить все свойства актива с помощью QueryBuilder Api - PullRequest
0 голосов
/ 23 мая 2018

Когда я использую приведенный ниже запрос для AEM QueryDebug

path=/content/dam/we-retail  
type=dam:Asset  
p.limit=-1  
p.nodedepth=2  
p.hits=full  
p.guesstotal=true 

И сформированной URL / JSON QueryBuilder ссылка.

Я могупросмотреть все свойства для каждого актива, включая jcr: content, метаданные, как показано ниже:

enter image description here

Мне нужно вернуть тот же результат в сервис / конечную точку i 'м на АЭМ для заказчика.Когда я перевожу тот же самый запрос выше в API построителя запросов

queryParamsMap.put("type", "dam:Asset");  
queryParamsMap.put("p.limit", "-1");  
queryParamsMap.put("p.nodedepth", "2");  
queryParamsMap.put("p.hits", "full");  
queryParamsMap.put("p.guessTotal", "true");  

Как я могу получить все значения?

SearchResult result = query.getResult();  
for (final Hit hit : result.getHits()) {  
  Resource resource = hit.getResource();  
  Asset asset = resource.adaptTo(Asset.class);  

Если я использую asset.getMetadata(), мы можем видеть только свойствав jcr:content\metadata, но не в других свойствах.

и

, если я использую ValueMap properties = resource.getValueMap();, мы можем получить все свойства актива (например, jcr: path, jcr: primaryType и т. д.), но не "метаданные ".

Есть ли способ получить все значения для узла актива?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Другой способ получить все свойства актива AEM от самого узла dam: Asset к узлу метаданных (jcr: content / metadata) использует Модели привязки Apache и адаптирует каждый ресурс, возвращаемый вашимзапрос к этой модели.

Например:

@Model(adaptables=Resource.class)
public class MyAsset{

    @Inject
    @Named("jcr:created")
    private String createdDate;

    @Inject
    @Named("jcr:createdBy")
    private String createdBy;

    @Inject
    @Named("jcr:content/jcr:lastModified")
    @Optional
    private String lastModified;

    @Inject
    @Named("jcr:content/metadata/dc:title")
    @Optional
    private String title;

    @Inject
    @Named("jcr:content/metadata/dc:description")
    @Optional
    private String description;

    @PostConstruct
    protected void init() {
         // You can code here any task needed to be executed after all the injections of the model are done
    }

  //getters and setters...

}

Примечание , что вы можете указать любое свойство любого узла-потомка ресурса с помощью аннотации @Named.

Я предлагаю вам использовать этот подход, если вам нужны определенные и несколько свойств ресурса.Если вам нужно все свойства Я думаю, что вы нашли подход лучше, потому что вам не нужно создавать модель для поддержки всех свойств.

Используя модель, окончательный код будет:

for (Hit hit : result.getHits()) {
      Resource resource = hit.getResource();
        if(resource!=null){
         MyAsset myAsset = resource.adaptTo(MyAsset.class);
        Logger.info("The asset {} was modified on {}", myAsset.getTitle(), myAsset.getLastModified());
        }
    }

Для получения дополнительной информации о модели строп вы можете обратиться к:

https://sling.apache.org/documentation/bundles/models.html

0 голосов
/ 24 мая 2018

После некоторых исследований я нашел следующее решение.Публикация здесь для других ссылок.

Как уже упоминалось @ Imran-Saeed, нет метода, который бы возвращал все свойства Актива (или Узла. Актив также является узлом) в AEM.Мы должны сделать это в комбинации.

  1. Получить все свойства верхнего уровня (корневой уровень узла).К ним относятся jcr:created, jcr:createdBy и т. Д.
  2. Получить все свойства jcr:content уровня.К ним относятся cq:name, cq:lastModified и т. Д.
  3. Получить все свойства уровня jcr:content\metadata.К ним относятся dc:title, любые пользовательские метаданные и т. Д.
  4. Вы можете добавить все это к другому новому ValueMap, который может содержать все свойства определенного узла / актива.

enter image description here

Ниже приведен фрагмент кода:

Resource resource;
ValueMap mainProperties;
ValueMap assetMetadataProperties;
Resource metadataResource;
ValueMap jcrProperties;
Resource jcrdataResource;
ValueMap allProperties;

for (Hit hit : result.getHits()) {
        //LOGGER.info("\n********Hit path="+hit.getPath()+", title="+hit.getTitle());
        resource = hit.getResource();

        if(null!=resource){
            mainProperties = resource.getValueMap();

            // Add JCR Properties
            jcrdataResource = resource.getChild("jcr:content");
            jcrProperties = ResourceUtil.getValueMap(jcrdataResource);

            // Add Metadata properties
            metadataResource = resource.getChild("jcr:content/metadata");
            assetMetadataProperties = ResourceUtil.getValueMap(metadataResource);

            // Adding all togethe
            allProperties = new ValueMapDecorator(new HashMap());
            allProperties.putAll(hit.getProperties());
            allProperties.putAll(mainProperties); // Includes jcr:created createdDate etc.
            allProperties.put("jcr:path",hit.getPath()); //Add Path
            allProperties.putAll(jcrProperties);
            allProperties.putAll(assetMetadataProperties);

            //LOGGER.debug("All Asset Properties="+new Gson().toJson(allProperties));               
        }
    }

Примечание

  1. jcr:path isне возвращается ни одним из вышеперечисленных.Поэтому мне пришлось явно добавить его, используя hit.getPath
  2. Имя узла или имя актива можно извлечь из hit.getTitle().Конечно, это также возвращается как часть cq:name.
  3. Есть и другие способы получить свойства.Еще один способ - получить Node и получить свойства.com.day.cq.search.result.Hit имеет метод getNode(), который возвращает интерфейс java.jcr.Node, и вы можете использовать get для извлечения свойств.
...