2017-01-26 2 views
0

Я пытаюсь реализовать пользовательский предикат службы OSGI для pathbrowser. Если кто-то знает, что не так с этим кодом :) Ниже приведено исключение. Может быть, это что-то с @Component или зависимостьСоздайте собственный предикат pathbrowser в AEM 6.2

<path jcr:primaryType="nt:unstructured" 
     sling:resourceType="granite/ui/components/foundation/form/pathbrowser" 
     fieldDescription="List item link" 
     fieldLabel="List Item link" 
     name="./path" 
     predicate="predicate" 
     rootPath="/content"> 
</path> 

реализации предиката:

import org.apache.commons.collections.Predicate; 
import org.apache.felix.scr.annotations.Component; 
import org.apache.felix.scr.annotations.Properties; 
import org.apache.felix.scr.annotations.Property; 
import org.apache.felix.scr.annotations.Service; 
import org.apache.sling.api.resource.Resource; 

import com.day.cq.commons.predicate.AbstractResourcePredicate; 
import com.day.cq.wcm.api.Page; 

@Component(label = "Content-page Predicate", description = "This predicate is used to restricted to allow selection of pages that have template content-page") 
@Service(value = Predicate.class) 
@Properties({ 
    @Property(label = "Predicate Name", name = "predicate.name", value = "predicate", propertyPrivate = true) }) 
public class ContentPagePredicate extends AbstractResourcePredicate { 

    private static final String CQ_TEMPLATE_CONTENT = "/conf/xxx-lab/settings/wcm/templates/content-page"; 

    @Override 
    public boolean evaluate(Resource resource) { 
     if (null != resource) { 
      if (!resource.getResourceType().equals("cq:Page")) { 
       return false; 
      } 
      Page page = resource.adaptTo(Page.class); 

      return page.getTemplate().getName().equals(CQ_TEMPLATE_CONTENT); 

     } 
     return false; 
    } 
} 

Maven построить выход:

[ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.20.0:scr (generate-scr-scrdescriptor) on project SomethingDemo.core: Execution generate-scr-scrdescriptor of goal org.apache.felix:maven-scr-plugin:1.20.0:scr failed: An API incompatibility was encountered while executing org.apache.felix:maven-scr-plugin:1.20.0:scr: java.lang.VerifyError: Constructor must call super() or this() before return 
[ERROR] Exception Details: 
[ERROR] Location: 
[ERROR] com/day/cq/commons/predicate/AbstractNodePredicate.<init>()V @1: return 
[ERROR] Reason: 
[ERROR] Error exists in the bytecode 
[ERROR] Bytecode: 
[ERROR] 0x0000000: 2ab1 
+0

, что произойдет, если вы распространяется AbstractNodePredicate вместо AbstractResourcePredicate? –

ответ

2

Ошибка вы видите может случиться, когда вы расширяете класс от API AEM, который аннотируется аннотациями SCR (используется для генерации дескрипторов пакета OSGi) и, в то же время, запутанным в используемом Uber Jar.

Вы можете найти незамысловатый Uber Jar для версии AEM, которую вы используете в Adobe's public Maven repository.

Если вы представляете клиент или партнер, вы должны также иметь возможность скачать один из справочного сайта https://daycare.day.com/home/products/uberjar.html

Если ваш проект использует репозиторий, который уже имеет unobfuscated Jar, оно должно быть простым, как изменение зависимости.

Например, в проекте с помощью AEM 6,2 Uber Jar с затемненными классами

<dependency> 
    <groupId>com.adobe.aem</groupId> 
    <artifactId>uber-jar</artifactId> 
    <version>6.2.0</version> 
    <scope>provided</scope> 
    <classifier>obfuscated-apis</classifier> 
</dependency> 

Просто измените классификатор, чтобы получить unobfuscated версии:

<dependency> 
    <groupId>com.adobe.aem</groupId> 
    <artifactId>uber-jar</artifactId> 
    <version>6.2.0</version> 
    <scope>provided</scope> 
    <classifier>apis</classifier> 
</dependency> 

Заканчивать этот Github issue для более широкого обсуждение очень похожей проблемы.

Вы также можете найти этот Adobe Help Forum thread интересный, , хотя он относится к бета-версии.

+0

FWIW, unobfuscated uber jars теперь доступны для всех. См. Https://daycare.day.com/home/products/uberjar.html –

+0

@ i.net, который нужно знать. Однако я вижу, что ссылка, которую вы опубликовали, защищена паролем. Похоже на базовую HTTP-аутентификацию, но нет никаких указаний относительно того, какие учетные данные следует использовать. Использует ли это свой Adobe ID? – toniedzwiedz

+0

Извините, должен был уточнить, что и не могу сейчас отредактировать комментарий (недостаточно rep?) ... В принципе вам не нужно запрашивать UberJar, если вы клиент, потому что эта ссылка позволяет вам скачать его (при условии, что вы имеют к нему доступ). В случае, если у вас нет доступа, следующая ссылка на публичное репозитование Adobe предоставит вам незабитые файлы jar: https://repo.adobe.com/nexus/content/repositories/releases/com/adobe/aem/uber- jar/6.2.0/uber-jar-6.2.0-apis.jar Вы также найдете обфускационную версию в той же папке. Кроме того, они доступны и для других версий. –

1

Просто попробуйте реализовать org.apache.commons.collections.Predicate.

Также: resource.getResourceType().equals("cq:Page") не будет true, так как cq:Page - это ресурс jcr:pimaryType. page.getTemplate() не работает на публикацию:

public booean evaluate(Resource resource) { 
    if (null == resource) return false; 
    final ValueMap map = resource.getValueMap(); 
    return "cq:Page".equals(map.get("jcr:primaryType", "") 
      && CQ_TEMPLATE_CONTENT.equals(map.get("cq:template", "") 
} 
Смежные вопросы