Java @引用会话显示未满足的错误

Java @引用会话显示未满足的错误,java,session,aem,sling,Java,Session,Aem,Sling,我正在使用一个sling servlet。在这里,我使用javax.jcr.Session作为参考。 在进行构建之后,当我在system/console/components中看到时,我看到了以下错误 参考会话[“未满足”,“服务名称: Session“,”基数:1..1“,”策略:静态“,”策略 选项:不情愿,“不受服务约束”] 如何解决此问题?javx.jcr.Session不是服务组件,因此您不能使用@reference引用它(请参阅) 如果需要当前用户会话,可以从SlingHttpSer

我正在使用一个sling servlet。在这里,我使用
javax.jcr.Session
作为参考。 在进行构建之后,当我在system/console/components中看到时,我看到了以下错误

参考会话[“未满足”,“服务名称: Session“,”基数:1..1“,”策略:静态“,”策略 选项:不情愿,“不受服务约束”]


如何解决此问题?

javx.jcr.Session
不是服务组件,因此您不能使用
@reference
引用它(请参阅)

如果需要当前用户会话,可以从SlingHttpServletRequest对象中提取它,如下所示:

Session session = slingHttpServletRequest.getResourceResolver()
                    .adaptTo(Session.class);

如果您需要其他用户(可能是拥有“更好”权限的技术用户)的会话,您可以使用
ResourceResolverFactory
,这是一个可以引用的服务。

javax.jcr.session
不是一个服务,因此不能插入
@Reference
注释

要获得会话,您可以执行以下操作-

在AEM 6.x中,假设您使用这样的代码

 /**
 * Gets the service resource resolver.
 *
 * @return resourceResolver.
 * @throws LoginException - exception if unable to login to repo.
 */
public static ResourceResolver getServiceResourceResolver(ResourceResolverFactory resourceResolverFactory) throws LoginException {
    final Map<String, Object> authParam = new HashMap();
    authParam.put(ResourceResolverFactory.SUBSERVICE, APPLICATION_READER_SUBSERVICE.value());

    return resourceResolverFactory.getServiceResourceResolver(authParam);
}
/**
*获取服务资源解析程序。
*
*@returnresourcesolver。
*@throws LoginException-无法登录到repo时出现异常。
*/
公共静态ResourceResolver getServiceResourceResolver(ResourceResolverFactory ResourceResolverFactory)引发LoginException{
final-Map-authParam=new-HashMap();
authParam.put(ResourceResolverFactory.SUBSERVICE,应用程序\读取器\子服务.value());
返回resourceResolverFactory.getServiceResourceResolver(authParam);
}

您可以参考上述方法的示例实现

为什么他应该在servlet中获得服务资源解析器?响应对象有自己的会话绑定资源解析器,您可以直接从该资源解析器提取会话。的确,对于大多数用例,可以使用请求中的资源解析器在servlet中获取会话。我的观点是,对于发布时不需要节点操作的任何内容,都可以在不需要使用slingapi进行会话的情况下完成。您将在发布时获得的会话将具有匿名用户的权限,并且没有任何写入权限。因此,如果CRUD或工作流需要会话,最好不要使用来自资源解析器的会话request@AmeeshTrikha我认为这是一个坏的做法,并打开漏洞。在发布上,访问权限通常是匿名的,这不应该具有写入权限,而在作者上,用户是经过身份验证的,如果他的权限不允许他在特定空间中写入,这不应该被否决。管理或技术用户会话仅在预定的作业和事件侦听器中才有意义。@Thomas-我不确定它与我所说的有什么不同。为了进一步解释我的来龙去脉——1)JCR API是低级API,而Sling API围绕它进行包装。servlet中的代码是在Sling的上下文中出现的,它使得使用Sling API的代码比使用JCR API的代码更干净。现在继续第二个方面-2)会话是必需的,以防您想要执行存储库操作,而不仅仅限于用户管理、工作流启动、,维护作业等或任何系统用户交互。在所有这些情况下,匿名会话将没有足够的权限执行所需的操作。因此,您需要一个基于系统用户的会话或资源求解器来处理。这就是说,由开发人员来确保使用/创建的系统用户服务于特定目的,并且只有执行其预期任务的权限。AEM 6.x OOTB本身使用系统用户数来执行某些任务。在给定的用例中,它是一个servlet(假设它在发布时使用),如果它确实需要会话,并且只能与解析器一起工作,那么它需要的不仅仅是匿名会话