Передача параметров представления (Struts) в (Spring) ApplicationContext и использование их в Hibernate Interceptor - PullRequest
2 голосов
/ 16 сентября 2011

Извините за длинный заголовок, но я не знал другого способа быть конкретным.

Что у меня есть:

Я занимаюсь разработкой аудитаМодуль отслеживания, использующий перехватчик Hibernate для перехвата вызовов Hibernate и добавления записей журнала аудита.Это отлично работает.

Мое веб-приложение использует Struts2 и Spring.Мой перехватчик Hibernate имеет доступ к приложению SpringContext.

Что я хочу:

Поскольку я хочу "придать смысл" каждой записи журнала аудита, мне нужно передать параметры(например, сообщение String) по каждому запросу, сделанному на уровне представления (Struts), к SpringCon ApplicationContext.Таким образом, я могу получить доступ к параметру в Hibernate Interceptor и зарегистрировать его соответствующим образом.

Пример:

  1. Struts - страница сведений о пользователе: setPassword (user1, mypass), генерируя новое сообщение «Пользователь1 изменил свой пароль».
  2. Это сообщение внедряется в SpringCon ApplicationContext.
  3. Перехватчик Hibernate перехватывает «обновление» и получает предыдущее сообщение из ApplicationContext Spring, создав новую запись в журнале с сообщением.

Знаете ли вы, как это сделать?

Ответы [ 2 ]

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

Я предполагаю, что вы используете плагин Struts2 Spring для интеграции обоих.При использовании этого ваши действия Struts, перехватчики создаются фабрикой объектов Spring и, следовательно, могут извлечь выгоду из внедрения зависимостей Spring-компонентов.

На стороне Spring один путь может (у меня нет 'не пробовал) работать: используя запрашивать bean-объекты в области , например:

<bean id="myBean" class="com.foo.MyBean" scope="request"/>

Контейнер Spring создает новый экземпляр bean-компонента, используя определение bean-компонента myBean для каждого HTTPrequest.

На стороне Struts (ваше действие или пользовательский перехватчик) вы теперь можете внедрить bean-компонент Spring и установить свою информацию.Вы должны знать, что ваш бин теперь имеет состояние (информация, которую вы предоставили).

На стороне Hibernate теперь вы также должны иметь возможность получать бин из контекста и читатьинформацию и зарегистрируйте ее.

В качестве альтернативы вы можете подумать об использовании MDC (Mapped Diagnostic Context), как описано здесь для каркаса LOGBack .С помощью MDC вы можете очень легко поместить значения, например MDC.put("myKey", "myValue"), и зарегистрировать их с помощью пользовательского шаблона, например %X{myKey}.Это решение вообще обойдет ваш перехватчик Hibernate.

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

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

Я бы выбрал другой подход и сделал бы это в вызове сервис / сервис, а не полагался на перехватчики Hibernate.IMO, перехватчики Hibernate слишком низки в «концептуальном» приложении.Сервисы, OTOH, уже действуют как мост между уровнем представления и уровнем данных.

Так как вам (а) уже нужно «вручную» взаимодействовать с уровнем сервиса, и (б) перехватчики Hibernate неу меня нет тривиального взгляда на приложение (как, впрочем, и на ИМО, но это просто мое мнение :) Я бы продвинул аудит на уровень абстракции.

(яЯ знаю, что это меньше ответ и перенаправление, но это было слишком долго для комментария.)

...