Spring Data MongoDB 1.2.0 тихо представила новую функцию: поддержку базового аудита . Поскольку вы не найдете слишком много информации об этом в официальной ссылке в этом посте, я покажу, какие преимущества это дает, как настроить Spring для аудита и как аннотировать ваши документы, чтобы сделать их доступными для аудита. Аудит позволяет декларативно сообщить Spring для хранения:
- дата создания документа: @CreatedDate
- дата последнего обновления документа: @LastModifiedDate
- пользователь, создавший документ: @CreatedBy
- пользователь, который сделал последнее обновление: @LastModifiedBy
- текущая версия документа: @Version
конфигурация
Прежде всего, зависимости Maven от последних Spring Data MongoDB и Spring Data Commons. Кроме того, чтобы использовать аннотации аудита, связанные с датами, нам нужно добавить joda-time в classpath.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.2.1.RELEASE</version></dependency><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> <version>1.5.1.RELEASE</version></dependency><dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.2</version></dependency> |
Чтобы включить аудит, нам нужно добавить <mongo: auditing /> в конфигурацию Spring. В настоящее время нет способа настроить его через Java Config.
|
1
2
3
4
5
6
7
8
|
<mongo:auditing /><mongo:mongo id="mongo" /><bean class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongo" ref="mongo" /> <constructor-arg name="databaseName" value="blog-tests" /></bean> |
использование
Приведенная выше конфигурация предоставляет нам способ аудита, который включает управление версиями и временные метки. Пример документа будет выглядеть так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
@Documentpublic class Item { @Id private String id; ... @Version private Long version; @CreatedDate private DateTime createdAt; @LastModifiedDate private DateTime lastModified; ...} |
Теперь вы можете сохранить документ, используя MongoTemplate или ваш репозиторий, и все аннотированные поля устанавливаются автоматически.
Как вы, наверное, заметили, я не использовал здесь аннотации, относящиеся к пользователю @CreatedBy и @LastModifiedBy . Чтобы использовать их, нам нужно сообщить Spring, кто является текущим пользователем.
Сначала добавьте пользовательские поля в ваш проверяемый класс:
|
1
2
3
4
5
|
@CreatedByprivate String createdBy;@LastModifiedByprivate String lastModifiedBy; |
Затем создайте свою реализацию AuditorAware , которая получит текущего пользователя (вероятно, из сеанса или в контексте Spring Security — зависит от вашего приложения):
|
1
2
3
4
5
6
7
8
|
public class MyAppAuditor implements AuditorAware<String> { @Override public String getCurrentAuditor() { // get your user name here return "John Doe"; }} |
Последнее, что нужно сказать Spring Data MongoDB об этом классе, осведомленном об аудиторе, с помощью небольшой модификации в конфигурации Mongo:
|
1
2
|
<mongo:auditing auditor-aware-ref="auditor" /><bean id="auditor" class="pl.maciejwalkowiak.blog.MyAppAuditor"/> |