【问题标题】:ResourceResolverFactory is NULL (Adobe Experience Manager AEM)ResourceResolverFactory 为 NULL (Adobe Experience Manager AEM)
【发布时间】:2014-11-18 23:10:28
【问题描述】:

我正在尝试从 ResourceResolverFactory 获取对 ResourceResolver 的引用,如下所示:

@Reference
private ResourceResolverFactory resourceResolverFactory;

public void someMethod() {
    Map<String, Object> authenticationMap = new HashMap<String, Object>();
        authenticationMap.put(ResourceResolverFactory.USER, "user");
        authenticationMap.put(ResourceResolverFactory.PASSWORD, "pwd");

        //This line returns NullPointerException
        ResourceResolver resourceResolver =   resourceResolverFactory.getResourceResolver(authenticationMap); 
}

谁能告诉我我做错了什么? AEM API 版本 v6.0。

【问题讨论】:

  • 可以分享一些关于错误的事情
  • 你用@Component/@Service注解标记了这个类吗?
  • Pravin - 这是一个 NullPointerException。我无法获得 resourceResolverFactory 参考。 Alex - 是的,该类被标记为 @Component
  • 我可以假设您的组件/服务没有出现吗?您是否已验证 ResourceResolverFactory 组件实际上已启动并正在运行?

标签: java aem


【解决方案1】:

所以我所做的是创建一个 Activator 类,该类在部署和启动捆绑包时调用。然后 Activator 类获取 org.apache.sling.jcr.api.SlingRepository 的实例,我们可以使用它来连接到 JCR。这是激活码:

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.jcr.api.SlingRepository;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate = true, label = "Commons Activator")
public class Activator implements BundleActivator { 

@Reference
private SlingRepository repository;

private static final Logger logger = LoggerFactory.getLogger(Activator.class);

@Activate
@Override
public void start(BundleContext context) throws Exception {
    logger.info(context.getBundle().getSymbolicName() + " started");

    //My own factory class instance
    ResourceResolverDiscoveryService rrf = ResourceResolverDiscoveryService.getInstance();
    //Set the 'repository' in your factory class instance
    rrf.setSlingRepositoryFactory(repository);
}

@Deactivate
@Override
public void stop(BundleContext context) throws Exception {
    logger.info(context.getBundle().getSymbolicName() + " stopped");
}

}

然后在我想使用 JCR 存储数据的类中,我做了以下操作:

public class StoreInJCR {
  public void store(Quote quote) throws LoginException, RepositoryException {
        SlingRepository slingRepository = ResourceResolverDiscoveryService.getInstance().getSlingRepositoryFactory();

        // GOT IT!!! Mission Accomplished
        Session session = slingRepository.loginAdministrative(null);
        Node root = session.getRootNode();
        // Further code
        .
        .
  }
}

希望有人觉得这很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多