【问题标题】:AEM 6.3 - Inheritance in Sling Use classesAEM 6.3 - Sling Use 类中的继承
【发布时间】:2019-01-08 02:41:36
【问题描述】:

在 AEM 中,我有一个扩展 WCMUsePojo 的 Use 类 A。它有一个带有@Override 注释的activate() 方法,我在其中读取属性(比如说产品)并分配给变量。另外,我有一个 getter 方法来读取属性。现在,还有另一个类 B 扩展了类 A 并具有带有 @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}null,除非我在 ClassA 中将产品属性更改为静态。有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: aem sling


    【解决方案1】:

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

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


    补充说明:

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

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

    【讨论】:

    • 感谢亚历山大。但是,当我在 Class A 中将 product 变量和相应的 getter 方法声明为静态时,它是如何工作的
    • 将修饰符更改为static 不应该改变任何东西,我认为问题在于您在HTL 中使用了test.sample.ClassA。如果您在 HTL 中使用 test.sample.ClassB,除非您在 ClassB.activate() 方法中执行 super.activate(),否则您仍然会有空产品
    猜你喜欢
    • 2018-08-03
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多