我想以编程方式访问内容,我尝试了以下内容:
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:我试图访问发布和作者实例并得到了同样的例外。
答案 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();