【问题标题】:AEM Osgi Sling Model @PostConstruct never calledAEM Osgi Sling Model @PostConstruct 从未调用过
【发布时间】:2017-06-13 05:11:43
【问题描述】:

我的 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";
    }
}

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

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

吊索模型包:

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

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

【问题讨论】:

  • 什么是 AEM 版本?
  • 我猜你不能在init()方法上添加@PostConstruct注解。
  • @i.net 我们使用的是 6.1 版
  • FWIW,只要您的包的依赖范围设置为提供并且适用,就可以忽略 intellij 警告。我认为这只是 intellij 设计中提供的依赖项的警告
  • 您确定您的模型实际上是使用吊索模型创建的吗?请检查您是否在 pom.xml maven-bundle-plugin 配置中注册了您的包,您应该有类似 &lt;Sling-Model-Packages&gt;your.package&lt;/Sling-Model-Packages&gt; 的内容

标签: annotations osgi adobe aem sling


【解决方案1】:

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

如果未在此处列出,您很可能没有指定 maven-bundle-plugin&lt;Sling-Model-Packages&gt; 属性。

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

更新:

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

吊索模型类:

@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 指令的使用 - 您需要提供型号名称。

另外,正如我在 cmets 中提到的,您不应该将 javax.annotation-api 添加为依赖项,因为它是 JDK 的一部分。

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

【讨论】:

  • 我的模型已列出: Adaptable:org.apache.sling.api.resource.Resource 提供Bundle:org.apache.sling.models.impl 可用适配器:* com.asadventure.platform.component。 general.textblockvalidator.TextBlockValidatorModel。我的包也在 sling-model-packages 下指定。
  • 那很好。然后只需尝试将 init() 方法更改为受保护甚至是公共的。我看不出它不起作用的任何其他原因。
  • 将其更改为受保护和公开,没有更改。会不会是 @PostConstruct 没有被识别?
  • JDK自带的“javax.annotation”库。
  • PS:你真的应该使用 UberJar,它会让你的生活更轻松;)
【解决方案2】:

我的猜测是您的类正在由 Java Use 提供程序初始化,而不是适应当前资源或请求。

看起来,当你使用 data-sly-use 时,它​​会尝试几件事来获取一个对象(我不记得顺序):

  • 获取具有该名称的 Osgi 服务
  • 使用 AEM Java USE API
  • 将当前请求/资源适应您的模型类(您想要的情况)
  • 只需将该类视为 Java Pojo 并对其进行实例化(不调用 post 构造,不会进行注入)。

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

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

【讨论】:

  • 奇怪的是注入确实发生了,我能够注入 OSGI 服务。
  • 请原谅我在此对话中的干预和我的无知 --- 您能告诉我如何在 AEM 6.1 上安装“Scripting HTL/Sightly Sling Models Use Provider”吗?我似乎面临同样的问题 - 我的吊索模型没有注册,没有调用 PostConstruct 注释方法,看起来模型类正在由 JavaUseProvider 实例化,它为注入的变量抛出 NullPointerExceptions。
  • @saasira 最简单的方法是将捆绑包 (search.maven.org/…) 嵌入到 AEM 包中(“安装”文件夹下方)。
  • 谢谢@santiagozky;我试过了,但仍然没有注册吊索模型。 SightlyJava_component.render(SightlyJava_component.java:60) 因为没有注入 osgi 服务而失败并显示空指针。不仅没有调用 postconstruct 方法。我们可以强制使用模型提供程序,否则会因异常而失败而不是使用 javause 提供程序?
  • @Saasira 这就是提供者所做的。它使用 ModelFactory 服务而不是 adaptTo 来实例化模型。 ModelFactory 传播异常(adaptTo 从不这样做)。
【解决方案3】:

对于仍在寻找上述问题未解决的答案的任何人,我的问题是我没有包含 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 之间的依赖项冲突问题。

【讨论】:

  • 这间接帮助了我很多时间。我使用的是 Google Cloud API,这个使用的 javax.annotation 破坏了我的 slingModel。所以我最终把我的包裹一分为二。一个包含我的项目代码和 sling 模型两个仅包含 Google API 代码及其依赖项。现在两者都工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多