如何在不设置Hybris的硬编码目录版本的情况下获得导航节点?

时间:2018-09-02 21:09:16

标签: java sap hybris

我从AfterSaveListener中的自定义类别服务中调用一个方法,在此方法中,我需要cmsNavigationService返回的根导航节点,但是每当我调用此方法时,它都会引发错误:< / p>

  

de.hybris.platform.cms2.exceptions.CMSItemNotFoundException:没有具有ID的NavigationNode。

当我通过设置硬编码内容目录时

getCatalogVersionService().setSessionCatalogVersion(".....")

我处理了这个问题,但对我来说似乎并非如此。我可以通过使用

来处理相同的类别问题
userService.setCurrentUser(userService.getAdminUser());

为了消除所有灵活搜索的限制,但是此解决方案不适用于导航节点。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

通常,没有目录版本就无法获得导航节点,因为它们是目录感知的,这意味着您有一个NavigationNode的多个实例。在这种情况下,Hybris无法确切知道您需要哪个。但是,可以更好地处理您的解决方法。当您需要特定用户进行代码中的操作时,可以像这样使用它。可以肯定的是,您可以在try()中添加一个try-finally块,并在try中设置您的参数,并最终将它们删除。

private Object myMethod()
{
    return getSessionService().executeInLocalView(new SessionExecutionBody()
    {
        @Override
        public Object execute()
        {
            // Your code for an isolated session. Set session params here, remove restrictions and so on.
            //searchRestrictionService.disableSearchRestrictions(); for example
            return new Object();

        }
    }, userService.getAdminUser()); // You can also specify as which user you want to execute the code
}

另一个有趣的事情是这个。

final Map<String, Object> params = ImmutableMap.of(InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_TYPES,
                ImmutableSet.of(InterceptorExecutionPolicy.InterceptorType.VALIDATE));
        sessionService.executeInLocalViewWithParams(params, new SessionExecutionBody()

可以在其中指定不同的参数。例如,此禁用某些拦截器。

答案 1 :(得分:0)

CMSNavigationService提供了两种获取根导航节点的方法:

一个不接受任何参数作为参数,另一个不接受目录版本的参数。传递目录版本时,服务将在此特定目录版本中搜索导航节点。

如果不指定一个,它将在会话目录版本中搜索。 hybris不在会话中为cronjobs设置目录版本。因此,您不应找到导航节点。当您在会话中手动设置目录版本时(带有您的问题的代码段),它将再次起作用。

我希望我正确理解了这个问题。