Auditing entities in Spring Data MongoDB

Spring Data MongoDB 1.2.0 silently introduced new feature: support for basic auditing. In this post I will show what benefits does it bring, how to configure Spring for auditing and how to annotate your documents to make them auditable.
Auditing let you declaratively tell Spring to store:

Configuration

First of all add Maven dependencies to latest Spring Data MongoDB and Spring Data Commons. Additionally in order to use date-related audit annotations we need to add joda-time to class-path.

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

In order to enable auditing we need to add <mongo:auditing/> to Spring configuration. Currently there is no way to configure it through Java Config.

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

Usage

Configuration above provides us way for auditing that includes versioning and time stamps. Example document will look like:

 @Document  
 public class Item {  
   @Id  
   private String id;  
   ...  
   @Version  
   private Long version;  
   @CreatedDate  
   private DateTime createdAt;  
   @LastModifiedDate  
   private DateTime lastModified;  
   ...  
 }  

Now you can save document using MongoTemplate or your repository and all annotated fields are auto magically set.

As you have probably noticed I did not use here user related annotations @CreatedBy and @LastModifiedBy. In order to use them we need to tell Spring who is a current user.

First add user related fields to your audited class:

 @CreatedBy  
 private String createdBy;  
 @LastModifiedBy  
 private String lastModifiedBy;  

Then create your implementation of AuditorAware that will obtain current user (probably from session or Spring Security context – depends on your application):

 public class MyAppAuditor implements AuditorAware<String> {  
   @Override  
   public String getCurrentAuditor() {  
     // get your user name here  
     return "John Doe";  
   }  
 }  

Last thing is to tell Spring Data MongoDB about this auditor aware class by little modification in Mongo configuration:

 <mongo:auditing auditor-aware-ref="auditor" />  
 <bean id="auditor" class="pl.maciejwalkowiak.blog.MyAppAuditor"/>  
Next Post Newer Post Previous Post Older Post Home

2 comments :

  1. Hi,

    I've implented this code, and the date fields are not getting automatically set. There are no errors. The data gets stored and retrieved from Mongo, but the date fields are null. Any suggestions on what I can do to get the dates automatically set? If you need to see my code, let me know. It's an example program I'm using to test this out.
    -T

    ReplyDelete
  2. Hi,

    I've implented this code, and the date fields are not getting automatically set. There are no errors. The data gets stored and retrieved from Mongo, but the date fields are null. Any suggestions on what I can do to get the dates automatically set? If you need to see my code, let me know. It's an example program I'm using to test this out.
    -T

    ReplyDelete