我的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>
有什么想法吗?提前谢谢!
答案 0 :(得分:4)
首先,通过在此网页中查找您的班级来检查您的Sling Model是否已正确注册: http://localhost:4502/system/console/status-adapters
如果未在此列出,则很可能未指定<Sling-Model-Packages>
的{{1}}属性。
我还会尝试将maven-bundle-plugin
方法的访问修饰符更改为init
或protected
。
<强>更新强>
我为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的一部分。
答案 1 :(得分:1)
我的猜测是,您的类正在由Java使用提供程序初始化,而不是调整当前资源或请求。
在使用数据狡猾的时候,它会尝试几件事来获取一个对象(我无法回想起这个命令):
我见过几种情况,吊索模型的注入或后构造方法失败,并且默认为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的版本)之间的依赖冲突。