CQ5: Как программно узнать ресурс по URL-адресу?

Согласно интерфейсу ResourceResolver:

http://dev.day.com/docs/en/cq/current/javadoc/org/apache/sling/api/resource/ResourceResolver.html

Существует три способа разрешения пути или запроса к ресурсу:

  1. Resource resolve(HttpServletRequest request) Устарело. начиная с версии 2.0.4 вместо этого используйте resolve(HttpServletRequest, String).

  2. Resource resolve(HttpServletRequest request, String absPath) Разрешает ресурс из заданного absPath, при необходимости принимая во внимание HttpServletRequest, например значение заголовка запроса узла.

  3. Resource resolve(String absPath) Разрешает ресурс по заданному абсолютному пути.

Но если у меня есть случайная заданная строка URL-адреса (например, http://www.mycompany.com/whatever.html), как мне программно узнать соответствующий ресурс данного URL-адреса?


person hko19    schedule 14.01.2014    source источник
comment
Вы нашли правильный API. Ваш вопрос, как бы вы использовали это в JSP/Servlet?   -  person diffa    schedule 14.01.2014
comment
Проблема в том, что указанный API не принимает строку URL-адреса, а только строку absPath.   -  person hko19    schedule 20.01.2014


Ответы (2)


Если имя хоста/порт из URL-адреса сопоставляется с расположение репозитория контента CQ попытается преобразовать предоставленный URL-адрес.

В сервлете ResourceResolver можно получить из slingRequest:

ResourceResolver resourceResolver = slingRequest.getResourceResolver();
String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
Resource res = resourceResolver.resolve(resourcePath);

Имейте в виду, что для работы коротких URL-адресов и доменов, подобных приведенным выше, вам необходимо настроить сопоставление вашего экземпляра.

В JSP, если вы вызвали тег <sling:defineObjects/> или <cq:defineObjects/>, вы сможете использовать:

<sling:defineObjects>
<%
    String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
    Resource res = resourceResolver.resolve(resourcePath);
%>

Дополнительная информация представлена ​​в " Получение ресурсов и свойств в Sling"

Протестируйте пару URL-адресов, которые, как вы знаете, хороши. Например:

Resource res = resourceResolver.resolve("http://localhost:4502/content/geometrixx.html");
Resource res = resourceResolver.resolve("/content/geometrixx.html");

Оба вышеперечисленных должны разрешаться в один и тот же ресурс.

Если вы хотите проверить, может ли CQ разрешить URL-адрес, который вы предоставляете, попробуйте страницу преобразователя jcr в системной консоли http://localhost:4502/system/console/jcrresolver, чтобы увидеть, отображается ли URL-адрес, если он не содержит полного /content/.. в пути. Любой сопоставленный должен иметь возможность решено.

person diffa    schedule 14.01.2014
comment
Мой эксперимент показал, что путь в getResource(path) вообще не принимает протокол/имя хоста/порт. Таким образом, приведенный выше код, скорее всего, вернет значение null. - person hko19; 17.01.2014
comment
Вопрос состоит в том, чтобы выяснить ресурс с учетом строки URL. AbsPath в разрешении (String absPath) НЕ принимает строку URL. Пример использования resolve() не является решением. - person hko19; 20.01.2014
comment
Ты прав. Преобразователь ресурсов использует помощника, который берет URL-адрес и просто использует путь из URL-адреса и игнорирует протокол/хост/порт. Я обновил пример, чтобы использовать java.net.URI для получения пути перед разрешением. - person diffa; 22.01.2014

Класс ResourceResolver был реализован для возврата ресурса . В частности, для этого типа разрешения существуют функции resolve(). Однако даже при наличии трех перегруженных функций resolve() ни одна из них не принимает строку URL.

Данный ResourceResolver принимает HttpServletRequest в качестве входных данных, если я могу преобразовать (адаптировать) данный URL-адрес в HttpServletRequest, используя HttpServletRequestWrapper, проблема будет решена. Поэтому решение состоит в том, чтобы реализовать класс ResolverRequest, который расширяет HttpServletRequestWrapper.

Полное решение и пример кода см. на странице "Программный поиск ресурса Sling по указанному URL"

person hko19    schedule 10.02.2014