Spring Data MongoDB 1.2.0 тихо представила новую функцию: поддержку базового аудита . Поскольку вы не найдете слишком много информации об этом в официальной справке в этом посте, я покажу, какие преимущества это дает, как настроить Spring для аудита и как аннотировать ваши документы, чтобы сделать их проверяемыми. Audit позволяет декларативно сообщать 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
|
@Document public 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
|
@CreatedBy private String createdBy; @LastModifiedBy private 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" /> |