Как получить навигационный узел без установки жестко закодированной версии каталога в Hybris? - PullRequest
0 голосов
/ 03 сентября 2018

Я вызываю метод из пользовательской службы категорий в AfterSaveListener, и в этом методе мне нужны корневые узлы навигации, которые возвращаются cmsNavigationService, но всякий раз, когда я вызываю этот метод, он выдает ошибку:

de.hybris.platform.cms2.exceptions.CMSItemNotFoundException: Нет NavigationNode с идентификатором.

Когда я устанавливаю жестко закодированный каталог контента через

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

Я решаю эту проблему, но она не кажется мне верной. Я могу решить ту же проблему для категорий, используя

userService.setCurrentUser(userService.getAdminUser());

, чтобы снять все ограничения для гибкого поиска, но это решение не работает для узла навигации.

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

CMSNavigationService предлагает два метода для получения корневых узлов навигации:

Один, который не принимает ничего в качестве параметров, и тот, который принимает версию каталога в качестве параметра. Когда вы передаете версию каталога, служба будет искать узлы навигации в этой конкретной версии каталога.

Если вы не укажете один, он будет искать в версии каталога сессий. hybris не устанавливает версии каталога в сеансе для cronjobs. Таким образом, вы не должны найти узел навигации. Когда вы вручную устанавливаете версию каталога в сеансе (с фрагментом в вашем вопросе), она будет работать снова.

Надеюсь, я правильно понял вопрос.

0 голосов
/ 03 сентября 2018

Как правило, вы не можете получить навигационные узлы без версии каталога, потому что они осведомлены о каталоге, это означает, что у вас есть несколько экземпляров одного NavigationNode. В этом случае Hybris не может знать, что именно вам нужно. Тем не менее, ваши обходные пути могут быть обработаны в лучшем виде. Когда вам нужен конкретный пользователь для чего-то в вашем коде, вы можете использовать его следующим образом. Просто чтобы быть уверенным, вы можете добавить блок try - finally в execute () и установить свои параметры в try и удалить их в finally.

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()

Где вы можете указать различные параметры. Например, этот отключает некоторые перехватчики.

...