Работа с DataManager при старте приложения

Добрый день.

У нас стоит задача при старте приложения закешировать некоторые данные, которые нужно запросить из БД, и потом повторно их использовать, уже не обращаясь к базе.

    @Component(NewBean.NAME)
public class NewBean {
    public static final String NAME = "untitled_NewBean";

    @Inject
    protected DataManager dataManager;

    @EventListener
    protected void appStarted(AppContextStartedEvent event) {
        List<Person> personList = dataManager.load(Person.class).list(); //На этом месте система не работает
    }
}

на консоль выводится java.lang.SecurityException: No security context bound to the current thread

Как правильно решить задачу?

Попробуйте такой подход.

AppContext.withSecurityContext(new SecurityContext(userSession), () -> {
     List<Person> personList = dataManager.load(Person.class).list();
}

Только вот какую сессию вы будете использовать я не знаю. Я выполняю в UserLoggedInEvent там можно сессию получить.
Вот тут есть примеры с null с виде сессии Делегирование заданий в Bproc - #3 от пользователя gorbunkov

2 симпатии

Спасибо, я сделал в анонимной сессии, предварительно дав ей права.

    AppContext.withSecurityContext(new SecurityContext(anonymousSessionHolder.getAnonymousSession()), () -> {
                this.persons = dataManager.load(Person.class).list();
            }
    );

Используйте бин Authentication для аутентификации подобной логики:
https://doc.cuba-platform.com/manual-7.2/system_authentication.html