使用JCR以编程方式访问CQ5内容

时间:2013-09-04 09:53:30

标签: java cq5 jcr sling

我想以编程方式访问内容,我尝试了以下内容:

private Session getSession(String user, String passwort) {
        Session session = null;
        try {
            Repository repository = JcrUtils.getRepository("http://localhost:4503/crx/server");
            JcrUtils.getRepository("http://localhost:4503/crx/server");
            session = repository.login(new SimpleCredentials(user, passwort.toCharArray()));
        } catch (RepositoryException e) {
            LOG.error(e.getMessage());
        }
        return session;
    }

当我调用getRepository方法时,我收到以下异常:

 javax.jcr.RepositoryException: Unable to access a repository with the following settings:
        org.apache.jackrabbit.repository.uri: http://localhost:4503/crx/server
    The following RepositoryFactory classes were consulted:
    Perhaps the repository you are trying to access is not available at the moment.

我有cq5.4版本。有什么想法吗?

P.S:我试图访问发布和作者实例并得到了同样的例外。

4 个答案:

答案 0 :(得分:5)

您不需要也不想在Sling / CQ应用程序中调用JcrUtils.getRepository,您应该访问CQ提供的SlingRepository OSGi服务。

最简单的是在OSGi声明性服务@Reference中使用@Component注释 - 在Apache Sling代码库中有多个这样的示例,http://svn.apache.org/repos/asf/sling/trunk/samples/slingbucks示例是一个很好的起点为此。

如果您的代码是作为请求处理的一部分执行的,您不需要自己创建会话,您可以通过调用request.getResourceResolver().adaptTo(Session.class)来获取它,其中request是您的SlingHttpServletRequest进入Sling servlet。

答案 1 :(得分:1)

这是获得管理会话的准系统服务:

package your.package;

import org.apache.felix.scr.annotations.*;

import org.apache.sling.jcr.api.SlingRepository;
import javax.jcr.Session;

@Component(immediate=true, enabled=true)
@Service
public class YourServiceForRepository {
    @Reference
    protected SlingRepository repository;

    protected Session session;

    @Activate
    protected void activate() throws Exception {
        session = repository.loginAdministrative(null);
    }

    @Deactivate
    protected void deactivate() throws Exception {
        session.logout();
        session = null;
    }
}

您还可以修改此选项以基于凭据返回会话。但是目前还不清楚你正试图从哪个环境中获取会话,因此我无法就如何构建服务给出任何指示。

答案 2 :(得分:0)

作为捆绑激活的一部分保留JCR引用(例如会话或节点)是一个坏主意,因为会话或节点可能随着时间的推移变得无效 - 我过去必须调试并修复此问题。相反,出于安全原因,绝对需要使用上述的@Reference annotation和adaptTo方法或loginAdministrative()。

答案 3 :(得分:0)

如果要从OSGi服务与JCR进行交互,可以使用OSGi包。但是 - 您仍然可以从外部Java App与它进行交互。您可能想要编写一个Java工具来获取AEM JCR中的用户并将其转储到电子表格中。

在上面的示例中,http://localhost:4503/crx/server可能不是正确的网址。你可能是http://localhost:4502/crx/server。禁止这项工作 - 请参阅:http://scottsdigitalcommunity.blogspot.ca/2012/03/programmatically-accessing-day-cq.html

一旦完成会话 - 关闭它: session.save(); session.logout();