Sling Servlet中的CQ5 QueryBuilder参考

时间:2014-09-22 20:21:39

标签: cq5 jcr aem sling

我正在声明像这样的吊索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

关于我做错了什么建议?

2 个答案:

答案 0 :(得分:2)

我一直在使用this教程作为参考。 我遇到了关于Felix服务组件运行时(SCR)的this

所以我实现了以下

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>

所以虽然我不确定为什么没有生成bind / unbind方法,但我知道它们应该是,所以我手动生成它们。

<强>更新 我试图将maven-scr-plugin更新到版本1.20.0,这在mvn build期间产生了以下错误

[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。它的工作原理!生成了我的绑定/解除绑定访问器,一切都很棒。但是,我担心并且不知道是否应该使用版本1.9.0的org.apache.felix.scr.annotations,因为我在maven依赖项中将其标记为provided并且当我查看OSGi包时安装在cq实例上我看到以下

Apache Felix Declarative Services (org.apache.felix.scr) : Version 1.6.3.R1409029

答案 1 :(得分:-4)

要使依赖项注入起作用,您应该将成员变量声明为public。

尝试将其更改为

@Reference
public QueryBuilder queryBuilder;