Статьи

Аудит объектов в Spring Data MongoDB

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"/>