我正在尝试从 ResourceResolverFactory 获取对 ResourceResolver 的引用,但出现空指针异常

I am trying to get a reference to the ResourceResolver from the ResourceResolverFactory but got Null pointer Exception

      Map<String, Object> param = new HashMap<String, Object>();
      param.put(ResourceResolverFactory.SUBSERVICE,"datawrite");
      log.info("param created."); 
      ResourceResolver resolver = null;  
    try {
         resolver=resolverFactory.getResourceResolver(param);
         log.info("resolveer created.");   
      Session session = resolver.adaptTo(Session.class);
      log.info("Session created.");
        // Create a node that represents the root node
        Node root = session.getRootNode();
        // Get the content node in the JCR
        Node content = root.getNode("/content");        
        Node customerRoot = null;
        int custRec = doesCustExist(content);
                log.info("does Customer Exist : "+ custRec);
        // -1 means that content/customer does not exist
        if (custRec == -1) {
            // content/customer does not exist -- create it
            customerRoot = content.addNode("customer");
        } else {
            // content/customer does exist -- retrieve it
            customerRoot = content.getNode("customer");
        }

        int custId = custRec + 1; // assign a new id to the customer node
    // Store content from the client JSP in the JCR
        Node custNode = customerRoot.addNode("customer" + firstName + lastName + phone+desc);
    // make sure name of node is unique
        custNode.setProperty("id", custId);
        custNode.setProperty("firstName", firstName);
        custNode.setProperty("lastName", lastName);
        custNode.setProperty("phone", phone);
        custNode.setProperty("desc", desc);
        // Save the session changes and log out
        session.save();
        session.logout();
        return custId;
    }
catch (Exception e) {
        log.error("RepositoryException: " + e);
    }

我收到这个错误:

错误 [0:0:0:0:0:0:0:1 [1567433510240] GET /bin/abc HTTP/1.1] aem.community.mf.core.servlets.SaveJcrData RepositoryException: java.lang.NullPointerException

您似乎没有正确实例化资源解析器工厂。

您可以使用上下文中的 SlingObject 注释注入资源解析器,而不是使用工厂检索它。

例如

@SlingObject
private ResourceResolver resourceResolver;

更正如下。

resolver=resolverFactory.getServiceResourceResolver(param);

如果您尝试在 Sling 模型中获取资源解析器,请使用以下注释。

@Inject
  private ResourceResolver resourceResolver;

还要确保您的 class 收到来自 AEM 的呼叫。为了根据我以前遇到的情况进行更多解释,这里有一些例子:

Custom Worklow Process - 使用@Reference注解,您将能够获得资源解析器,因为流程是直接调用的 当工作流到达步骤

时从 AEM

Class A 从另一个 class B 调用 - 在这种情况下,资源解析器在 Class A 中将为空,因为此 class 没有得到从 AEM

调用

能否请您分享完整的堆栈跟踪。尝试始终打印堆栈跟踪(而不仅仅是消息),以便在正确的代码行轻松识别问题。

当我们尝试使用不同的用户进行操作时,我们必须使用 getServiceResourceResolver API 来获取基于用户的资源解析器。

这是一个用于在 servlet

中修改 content/view 的示例 servlet

https://github.com/sudheerdvn/aem-flash/blob/develop/core/src/main/java/com/flash/aem/core/servlets/ModifyContentServlet.java

您可以通过直接点击 URL 查看结果,如下所示(为查看目的添加了相同的 get 方法)

http://localhost:1502/bin/modifyContent.json

您可以通过两种方式解决这个问题:

  1. 尝试在 servlet 本身中使用 ResourceResolverFactory,这意味着您应该在 servlet 本身中定义它并在那里使用它来获取资源并使用

 resolver=req.getResourceResolver();

而不是

resolver=resolverFactory.getResourceResolver(param);

  1. 你应该确保你的 class 应该被注释为 @Component 然后尝试在 class 中获取资源,如下所示:

@Component
public class SaveJcrData implements SaveService {

    protected final Logger log = LoggerFactory.getLogger(this.getClass());

    @Reference
    private SlingRepository repository;

    @Reference
    private ResourceResolverFactory resolverFactory;

    private Session session;

    public void bindRepository(SlingRepository repository) {
        this.repository = repository;
    }

//Stores customer data in the Adobe CQ JCR
    public int injestData(String firstName, String lastName, String phone, String desc) throws Exception {

        Map<String, Object> param = new HashMap<String, Object>();
        param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
        ResourceResolver resolver = null;
        try {

            // Invoke the adaptTo method to create a Session used to create a QueryManager
            log.trace("In try.");
            resolver = resolverFactory.getServiceResourceResolver(param);                                                                           
                                                                            
            log.trace("resolveer created.");
            Session session = resolver.adaptTo(Session.class);
            log.info("Session created.");