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
方法的访问修饰符更改为 protected
或 public
。
更新:
我已经为 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.
的一部分
我的猜测是您的 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
之间的依赖项冲突问题。
我的 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
方法的访问修饰符更改为 protected
或 public
。
更新:
我已经为 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.
我的猜测是您的 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
之间的依赖项冲突问题。