Envers пользовательский ревизионный слушатель - PullRequest
4 голосов
/ 20 сентября 2011

Я использую Hibernate Envers в среде Tomcat. Работает нормально. Однако мне нужно иметь возможность добавить имя пользователя, который изменил данные, подлежащие аудиту. Это можно сделать, внедрив собственную версию RevisionEntity. Затем вам также нужно реализовать пользовательский RevisionListener, который будет заполнять дополнительную информацию, которую вы хотите проверить. Мне нужно проверить имя пользователя, которое изменило данные, которые должны быть проверены. В документации приведен пример того, как это сделать с помощью Seam. В RevisionListener они называют:

Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");

Для получения имени пользователя. В моем проекте мы разделили проект на отдельные модули для базы данных и сети. Мне нужно внедрить мой прослушиватель ревизии custum в мой модуль базы данных, чтобы иметь возможность получить текущее имя пользователя. Я не могу переместить RevisionListener в веб-пакет и ввести зависимость от веб-модуля из модуля базы данных. Как я могу получить текущее имя пользователя так, чтобы одновременно обрабатывать несколько пользователей, вошедших в мой пользовательский RevisionListener`?

Наилучшим решением будет то, которое работает в большинстве контейнеров.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Я понимаю, что вы хотите ограничить связь между модулями.Я делал это в прошлом, используя Spring и JSF.У меня был код доступа к данным в их собственных проектах, и мои веб-проекты зависели от банок доступа к данным.

Я написал слушателю в другом проекте, который знал о классах Hibernate и JSF API.Я смог использовать JSF API, чтобы найти вошедшего в систему пользователя.

Таким образом, веб-приложение зависит от данных и проекта слушателя.Проекту доступа к данным не нужно знать, где он используется и даже если происходит аудит.И слушатель настраивается в веб-проекте.

0 голосов
/ 21 сентября 2011

Это звучит как работа для внедрения контекста и зависимости (CDI). Вы можете определить интерфейс, такой как ClientInfo, который имеет абстрактные методы getUsername и getIPAddress. Затем на уровне презентации создайте конкретную реализацию этого интерфейса, скажем JSFClientInfo, которая использует FacesContext для получения имени пользователя и IP-адреса. Компонент бизнес-уровня может просто использовать @Inject ClientInfo.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...