我从AfterSaveListener
中的自定义类别服务中调用一个方法,在此方法中,我需要cmsNavigationService
返回的根导航节点,但是每当我调用此方法时,它都会引发错误:< / p>
de.hybris.platform.cms2.exceptions.CMSItemNotFoundException:没有具有ID的NavigationNode。
当我通过设置硬编码内容目录时
getCatalogVersionService().setSessionCatalogVersion(".....")
我处理了这个问题,但对我来说似乎并非如此。我可以通过使用
来处理相同的类别问题userService.setCurrentUser(userService.getAdminUser());
为了消除所有灵活搜索的限制,但是此解决方案不适用于导航节点。
我该如何解决这个问题?
答案 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设置目录版本。因此,您不应找到导航节点。当您在会话中手动设置目录版本时(带有您的问题的代码段),它将再次起作用。
我希望我正确理解了这个问题。