Dependency-Injection класса с конструктором, которому нужна информация о пользователе, вошедшем в SecurityContext - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы использовать HK2 DI для автоматического добавления нового экземпляра класса в зависимости от пользователя, вошедшего в мой API на Джерси.

Пользователь вошел в систему с классом AuthenticationFilter, и я могу найти его в @Context SecurityContext во всех моих конечных точках.

Дело в том, что у меня есть класс DAO, для которого требуется информация о пользователе. Это просто схема, по которой я должен выполнять запросы к базе данных.

Итак, конструктор моего Дао выглядит следующим образом:

public UserDao(String schemaCompte) {
    super(schemaCompte);
}

Кажется, что решение состоит в том, чтобы использовать Фабрику для создания экземпляра моего Дао с HK2, поэтому я попытался создать такой:

public class UserDaoFactory implements Factory<UserDao> {

    @Context SecurityContext securityContext;

    @Override
    public UserDao provide() {
        User userPrincipal = (User) securityContext.getUserPrincipal();
        return new UserDao(userPrincipal.getCode());
    }

    @Override
    public void dispose(UserDao userDao) {
    }
}

И привязка выглядит так:

bindFactory(UserDaoFactory.class).to(UserDao.class)

И реализация:

@Inject
public UserSvc(UserDao userDao) {
    ...
}

Но эта фабрика вызывается слишком рано в жизненном цикле моего приложенияи SecurityContext по-прежнему пуст.

Итак, насколько я понимаю, решение для того, чтобы это выполнялось во время выполнения, состояло бы в том, чтобы привязать Factory как прокси-сервер:

bindFactory(UserDaoFactory.class).proxy(true).to(UserDao.class)

Но когда я это делаю, я получаю среду выполненияисключение:

java.lang.RuntimeException: java.lang.InstantiationException: com.metier.user.UserDao_$$_jvst5c_0

Если у кого-то появилась идея, я пробовал так много вещей, и мне совершенно не повезло

...