AEM 6.3 - Наследование в классах Sling Use - PullRequest
0 голосов
/ 08 января 2019

В AEM у меня есть класс использования A, который расширяет WCMUsePojo. У него есть один activate() метод с аннотацией @Override, где я читаю свойство (скажем, продукт) и присваиваю переменную. Кроме того, у меня есть метод получения, чтобы прочитать свойство. Теперь есть еще один класс B, который расширяет класс A и имеет метод activate() с аннотацией @Override. В методе активации я читаю еще одно свойство.

Теперь из HTL я ссылаюсь на класс B и пытался получить «свойство продукта» (предполагая, что это свойство будет доступно в классе B через наследование), но я получаю нулевое значение. Но когда я изменяю модификатор свойства на static в классе A, он работает нормально.

См. Код ниже.

public class ClassA extends WCMUsePojo {  
    private String product;
 
    @Override   
    public void activate() throws Exception {    
        product = getProperties().get(“product”, "");
    }
  
    public String getProduct() {    
        return product;  
    }
}

public class ClassB extends ClassA {  
    private String lotno;
 
    @Override   
    public void activate() throws Exception {    
        lotno = getProperties().get(“lotno”, "");
    }
  
    public String getLotno() {    
        return lotno;  
    }
}


<div data-sly-use.productDetails="test.sample.ClassB"/>
${productDetails.product} 

${productDetails.product} равно null, если я не изменю свойство продукта на статическое в ClassA. Может кто-нибудь объяснить, почему это так?

1 Ответ

0 голосов
/ 08 января 2019

Просто добавьте super.activate() в ваш метод активации класса B.

Это стандартное поведение Java. Переопределенный метод заменяет унаследованный метод. Дочерний класс должен вызвать super.method-xyz(), чтобы использовать его снова. Таким образом, дочерний класс может контролировать, если унаследованный метод вызывается и когда.


Дополнительные замечания:

  1. В случае конструктора вы должны вызвать super(), потому что суперкласс должен быть инициализирован.

  2. Если вам следует использовать Sling-Models (что в основном рекомендуется), то у вас тот же эффект. Аннотация @PostConstruct также используется только для дочернего класса. Это более запутанно для всех. Вот почему я не рекомендую наследование Sling-Models в моих проектах. Часто это не нужно.

...