AEM Osgi Sling 模型 @PostConstruct 从未调用过

AEM Osgi Sling Model @PostConstruct never called

我的 Sling 模型中的 javax.annotation.PostConstruct 注释有问题。

我的 html 使用我的模型的文件:

<div data-sly-use="com.company.platform.component.general.textblockvalidator.TextBlockValidatorModel" data-sly-unwrap />

型号:

import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.annotations.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.inject.Inject;

@Model(adaptables = org.apache.sling.api.resource.Resource.class)
public class TextBlockValidatorModel {

    @PostConstruct
    private void init() {
        System.out.println();
    }

    public String getValidate(){
        return "This works";
    }
}

我可以从我的 sightly 文件中调用 getter,但我似乎从未输入我的 @PostConstruct init() 方法。

IntelliJ 确实在注释上给了我警告,但我不确定我做错了什么:

吊索模型包:

<Sling-Model-Packages>
   ...
   com.asadventure.platform.component
   ...
</Sling-Model-Packages>

有什么想法吗?提前致谢!

首先,通过在此网页中查找您的 class 来检查您的吊带型号是否已正确注册: http://localhost:4502/system/console/status-adapters

如果此处未列出,您很可能没有指定 maven-bundle-plugin.

<Sling-Model-Packages> 属性

我也会尝试将 init 方法的访问修饰符更改为 protectedpublic

更新:

我已经为 AEM 6.1 创建了一个示例项目,演示了 @PostConstruct 注释的使用。

吊索模型class:

@Model(adaptables = Resource.class)
public class SampleModel {

    private boolean postContructCalled = false;

    @PostConstruct
    public void init() {
        this.postContructCalled = true;
    }

    public boolean isPostContructCalled() {
        return this.postContructCalled;
    }
}

还有一个简单的 HTL 组件:

<sly data-sly-use.model="com.github.mickleroy.models.SampleModel">
    <p>@PostConstruct was called: ${model.postContructCalled}</p>
</sly>

请注意使用 data-sly-use 指令 - 您需要提供模型名称。

此外,正如我在评论中提到的,您不应添加 javax.annotation-api 作为依赖项,因为它是 JDK.

的一部分

此处提供完整源代码:https://github.com/mickleroy/sling-models-sample

我的猜测是您的 class 正在由 Java Use provider 初始化,而不是调整当前资源或请求。

在视觉上,当您使用 data-sly-use 时,它会尝试几种方法来获取对象(我不记得顺序了):

  • 获取具有该名称的 Osgi 服务
  • 使用 AEM Java 使用 Api
  • 将当前请求/资源调整到您的模型中class(您想要的情况)
  • 只需将 class 视为 Java Pojo 并实例化它(post 构造不会被调用,注入不会完成)。

我见过几个案例,其中吊索模型的注入或 post 构造方法失败并明显默认为 java 使用提供程序。如果发生这种情况,就会发生您所描述的情况。您有一个正确的对象 class,但没有发生注入,也没有调用 post 构造。

我的建议是仔细检查日志,如果是这种情况,您应该会看到错误。此外,您可以安装 Scripting HTL Sling Models Use Provider,它将传播创建吊索模型时的任何错误,使问题变得明显。

对于仍在寻找以上未解决的答案的任何人,对我来说问题是我没有包含 javax.annotation-api 依赖项:

<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
  <scope>provided</scope>
</dependency>

一旦我在父 pom 中添加它,并将其包含在核心 pom 中,@PostConstruct 就可以正常工作。

更新:

我必须这样做的原因是因为我包含了 jersey-client,它需要它自己的 javax.annotation-api 版本。自从我第一次翻译这个答案以来,我发现我需要将 jersey-client 及其依赖项分离到一个单独的捆绑项目中。这允许 Jersey 和 @PostConstruct 同时工作。

仅仅添加如上答案所示的依赖项导致 Jersey 版本 javax.annotation-api 和 AEM 版本(Felix 版本)javax.annotation-api 之间的依赖项冲突问题。