AEM Osgi Sling Model @PostConstruct从未打过电话

时间:2017-01-27 13:41:31

标签: annotations osgi adobe aem sling

我的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确实给了我关于注释的警告,但我不确定我做错了什么:

enter image description here

吊带-模型软件包:

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

enter image description here

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

3 个答案:

答案 0 :(得分:4)

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

如果未在此列出,则很可能未指定<Sling-Model-Packages>的{​​{1}}属性。

我还会尝试将maven-bundle-plugin方法的访问修饰符更改为initprotected

<强>更新

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

Sling Model类:

public

一个简单的HTL组件:

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

    private boolean postContructCalled = false;

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

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

请注意使用<sly data-sly-use.model="com.github.mickleroy.models.SampleModel"> <p>@PostConstruct was called: ${model.postContructCalled}</p> </sly> 指令 - 您需要提供型号名称。

另外,正如我在评论中提到的,您不应该将data-sly-use添加为依赖项,因为它是JDK的一部分。

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

答案 1 :(得分:1)

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

在使用数据狡猾的时候,它会尝试几件事来获取一个对象(我无法回想起这个命令):

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

我见过几种情况,吊索模型的注入或后构造方法失败,并且默认为java使用提供程序。如果发生这种情你有一个正确类的对象,但没有注入,也没有调用post构造。

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

答案 2 :(得分:0)

对于仍在寻找上述问题仍无法解决的问题的任何人,对我来说,问题是我没有包括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及其依赖项分离到一个单独的bundle项目中。这样,泽西岛和@PostConstruct可以同时工作。

仅在上面显示的答案中添加依赖项,就会导致Jersey的javax.annotation-api版本与AEM的javax.annotation-api版本(Felix的版本)之间的依赖冲突。