我正在尝试从 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
您可以通过直接点击 URL 查看结果,如下所示(为查看目的添加了相同的 get 方法)
您可以通过两种方式解决这个问题:
- 尝试在 servlet 本身中使用 ResourceResolverFactory,这意味着您应该在 servlet 本身中定义它并在那里使用它来获取资源并使用
resolver=req.getResourceResolver();
而不是
resolver=resolverFactory.getResourceResolver(param);
- 你应该确保你的 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.");
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注解,您将能够获得资源解析器,因为流程是直接调用的 当工作流到达步骤
时从 AEMClass A 从另一个 class B 调用 - 在这种情况下,资源解析器在 Class A 中将为空,因为此 class 没有得到从 AEM
调用能否请您分享完整的堆栈跟踪。尝试始终打印堆栈跟踪(而不仅仅是消息),以便在正确的代码行轻松识别问题。
当我们尝试使用不同的用户进行操作时,我们必须使用 getServiceResourceResolver API 来获取基于用户的资源解析器。
这是一个用于在 servlet
中修改 content/view 的示例 servlet您可以通过直接点击 URL 查看结果,如下所示(为查看目的添加了相同的 get 方法)
您可以通过两种方式解决这个问题:
- 尝试在 servlet 本身中使用 ResourceResolverFactory,这意味着您应该在 servlet 本身中定义它并在那里使用它来获取资源并使用
resolver=req.getResourceResolver();
而不是
resolver=resolverFactory.getResourceResolver(param);
- 你应该确保你的 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.");