AEM 6.3-Sling Use类中的继承

时间:2019-01-08 02:41:36

标签: aem sling

在AEM中,我有一个Use类A,它扩展了WCMUsePojo。它有一个带有activate()注释的@Override方法,在这里我读取属性(让我们说乘积)并分配给变量。另外,我有一个getter方法来读取属性。现在,还有另一个类B,它扩展了类A,并具有带有activate()批注的@Override方法。在Activate方法中,我正在读取另外一个属性。

现在,从HTL开始,我引用了B类,并试图获取“产品属性”(假设该属性可以通过继承在B类中使用),但是我得到的是空值。但是,当我在A类中将属性修饰符更改为static时,它就可以正常工作。

请参见下面的代码。

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}中将product属性更改为static,否则

nullClassA。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

只需在类B的激活方法中添加super.activate()

这是标准Java行为。重写的方法替换了继承的方法。子类必须调用super.method-xyz()才能重用。因此,子类可以控制是否调用继承的方法以及何时调用。


附加说明:

  1. 对于构造函数,您必须调用super(),因为还必须初始化超类。

  2. 如果应该使用Sling-Models(最推荐使用的是Sling-Models),则效果相同。注释@PostConstruct也仅用于子类。这让每个人都感到困惑。这就是为什么我不建议在项目中继承Sling-Model的原因。通常不需要。