我正在声明一个像这样的吊带servlet
@Component(metatype = false)
@Service(Servlet.class)
@Properties({
@Property(name = "sling.servlet.paths", value = "/bin/foo/bar"),
@Property(name = "sling.servlet.methods", value = "POST") })
public class FooBarServlet extends SlingAllMethodsServlet {
...
}我像这样覆盖doPost
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
...
}我可以从客户那里发帖。太棒了!
我加入了以下内容
@Reference
private QueryBuilder queryBuilder;根据文档,应该注入对查询生成器的引用。但似乎并非如此。在日志中我看到了这个错误
bindQueryBuilder cannot be found (java.lang.VerifyError: ...当我试图发布到servlet时,我得到了以下信息
javax.jcr.RepositoryException: org.apache.sling.api.resource.PersistenceException: Resource at '/bin/foo/bar' is not modifiable.在OSGi控制台中,我看到我的包已经安装好了,这就是它对servlet的看法。
Service ID 3075 Types: javax.servlet.Servlet
Service PID: com.myproject.FooBarServlet
Component Name: com.myproject.FooBarServlet
Component ID: 5526
Vendor: Adobe对于我做错了什么有什么建议吗?
发布于 2014-09-23 01:22:22
我一直在使用这教程作为参考。我遇到了关于(SCR)的这。
因此,我实现了以下内容
protected void activate(ComponentContext context) {
LOGGER.info("activating {}", this.getClass().getName());
}
protected void unbindQueryBuilder(QueryBuilder queryBuilder) {
this.queryBuilder = null;
}
protected void bindQueryBuilder(QueryBuilder queryBuilder) {
this.queryBuilder = queryBuilder;
}而且起作用了!因此,经过更深入的研究,我了解到这些绑定/取消绑定方法实际上是由maven-scr-plugin生成的,我有1.6.0版本。
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>generate-scr-scrdescriptor</id>
<goals>
<goal>scr</goal>
</goals>
<configuration>
<!-- Private service properties for all services. -->
<properties>
<service.vendor>Adobe</service.vendor>
</properties>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.2</version>
</dependency>
</dependencies>
</plugin>对于注释,我有1.4.0
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
</dependency>因此,虽然我不确定为什么没有生成绑定/取消绑定方法,但我知道它们应该生成,所以我手动生成它们。
update I尝试将maven-scr-plugin更新为1.20.0版本,这在mvn构建过程中产生了以下错误
[ERROR] Project depends on org.apache.felix:org.apache.felix.scr.annotations:jar:1.4.0:provided
[ERROR] Minimum required version is 1.9.0所以..。我将org.apache.felix.scr.annotations更新为1.9.0。而且起作用了!我的绑定/取消绑定访问器是生成的,一切都很好。但是,我很担心,也不知道是否应该使用org.apache.felix.scr.annotations的1.9.0版本,因为我在maven依赖项中将它标记为provided,当我查看安装在cq实例上的OSGi包时,我会看到以下内容
Apache Felix Declarative Services (org.apache.felix.scr) : Version 1.6.3.R1409029发布于 2014-09-23 07:08:50
要使依赖项注入工作,您应该将成员变量声明为public。
试着把它改成
@Reference
public QueryBuilder queryBuilder;https://stackoverflow.com/questions/25982555
复制相似问题