首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sling Servlet中的CQ5 QueryBuilder引用

Sling Servlet中的CQ5 QueryBuilder引用
EN

Stack Overflow用户
提问于 2014-09-22 20:21:39
回答 2查看 2.9K关注 0票数 0

我正在声明一个像这样的吊带servlet

代码语言:javascript
复制
@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

代码语言:javascript
复制
@Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
    ...
}

我可以从客户那里发帖。太棒了!

我加入了以下内容

代码语言:javascript
复制
@Reference
private QueryBuilder queryBuilder;

根据文档,应该注入对查询生成器的引用。但似乎并非如此。在日志中我看到了这个错误

代码语言:javascript
复制
bindQueryBuilder cannot be found (java.lang.VerifyError: ...

当我试图发布到servlet时,我得到了以下信息

代码语言:javascript
复制
javax.jcr.RepositoryException: org.apache.sling.api.resource.PersistenceException: Resource at '/bin/foo/bar' is not modifiable.

在OSGi控制台中,我看到我的包已经安装好了,这就是它对servlet的看法。

代码语言:javascript
复制
Service ID 3075 Types: javax.servlet.Servlet
Service PID: com.myproject.FooBarServlet
Component Name: com.myproject.FooBarServlet
Component ID: 5526
Vendor: Adobe

对于我做错了什么有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-23 01:22:22

我一直在使用教程作为参考。我遇到了关于(SCR)的

因此,我实现了以下内容

代码语言:javascript
复制
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版本。

代码语言:javascript
复制
            <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

代码语言:javascript
复制
            <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构建过程中产生了以下错误

代码语言:javascript
复制
[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包时,我会看到以下内容

代码语言:javascript
复制
Apache Felix Declarative Services (org.apache.felix.scr) : Version 1.6.3.R1409029
票数 2
EN

Stack Overflow用户

发布于 2014-09-23 07:08:50

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

试着把它改成

代码语言:javascript
复制
@Reference
public QueryBuilder queryBuilder;
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25982555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档