在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,否则 null
为ClassA
。有人可以解释为什么会这样吗?
答案 0 :(得分:0)
只需在类B的激活方法中添加super.activate()
。
这是标准Java行为。重写的方法替换了继承的方法。子类必须调用super.method-xyz()
才能重用。因此,子类可以控制是否调用继承的方法以及何时调用。
附加说明:
对于构造函数,您必须调用super()
,因为还必须初始化超类。
如果应该使用Sling-Models(最推荐使用的是Sling-Models),则效果相同。注释@PostConstruct
也仅用于子类。这让每个人都感到困惑。这就是为什么我不建议在项目中继承Sling-Model的原因。通常不需要。