2017-01-08 11 views
2

Я пытаюсь включить поля автоматического аудита с данными весны mongodb, как описано here. Ниже моя конфигурация классаАудит с spring-data-mongodb

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.abc") 
@EnableMongoRepositories(basePackages = "com.abc.xyz.repository") 
@EnableMongoAuditing 
public class ApplicationConfiguration { 

    @Bean 
    public MongoDbFactory mongoDbFactory() throws Exception { 
     ServerAddress serverAddress = new ServerAddress("127.0.0.1", 27017); 
     MongoCredential mongoCredential = MongoCredential.createCredential("user", "test", "abc123".toCharArray()); 
     MongoClient mongoClient = new MongoClient(serverAddress, Arrays.asList(mongoCredential)); 
     return new SimpleMongoDbFactory(mongoClient, "test"); 
    } 

    @Bean 
    public MongoTemplate mongoTemplate() throws Exception { 
     return new MongoTemplate(mongoDbFactory()); 
    } 
} 

Но когда я добавляю @EnableMongoAuditing, я получаю ошибку ниже при запуске сервера.

Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoAuditingHandler': Cannot create inner bean '(inner bean)#6dca0c34' of type [org.springframework.data.mongodb.config.MongoAuditingRegistrar$MongoMappingContextLookup] while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '(inner bean)#6dca0c34': Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type [org.springframework.data.mongodb.core.convert.MappingMongoConverter] found for dependency [org.springframework.data.mongodb.core.convert.MappingMongoConverter]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.data.mongodb.core.convert.MappingMongoConverter] found for dependency [org.springframework.data.mongodb.core.convert.MappingMongoConverter]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:236) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82) 

ответ

1

Вы можете проверить, если у вас есть Spring Data MongoDB зависимость 1.9.4.RELEASE или выше, как mongoAuditingHandler требует MappingMongoConverter, которая доступна в версии 1.9.4.RELEASE или выше, за список изменений - spring-data-mongodb-changelog, например:

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-mongodb</artifactId> 
    <version>1.9.4.RELEASE</version> 
</dependency> 
+0

Я использую 1.9.5.RELEASE. Можете ли вы указать указатели на использование MappingMongoConverter. – rohit

+1

Обнаружена проблема. Мой класс конфигурации не расширяет AbstractMongoConfiguration. – rohit

6

1: Убедитесь в том, у вас есть spring-data-mongodb

2: если вы используете @CreatedDate или @LastModifiedDate, тогда y ou не нуждается в дополнительной настройке.

class ClassName { 

    ....... 

    @CreatedDate 
    private DateTime createdDate; 

    @LastModifiedDate 
    private DateTime @lastModifiedDate; 

} 

3: если вы используете @CreatedBy и @LastModifiedBy тогда вы должны реализовать AuditorAware<T> интерфейс SPI

class ClassName { 

    ....... 

    @CreatedBy 
    private String createdBy; 

    @LastModifiedBy 
    private String lastModifiedBy; 

} 

public class AppAuditor implements AuditorAware<String> { 

    @Override 
    public String getCurrentAuditor() { 

     // get your user name here 
     return "xxxx"; 
    } 

} 

Осуществления AuditorAware, основанное на Spring Security из пружинного дока

class SpringSecurityAuditorAware implements AuditorAware<User> { 

    public User getCurrentAuditor() { 

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

    if (authentication == null || !authentication.isAuthenticated()) { 
     return null; 
    } 

    return ((MyUserDetails) authentication.getPrincipal()).getUser(); 
    } 
} 
Смежные вопросы