В MongoDb @CreatedBy становится пустым с помощью SpringBoot - PullRequest
1 голос
/ 29 марта 2019

Я использую весенние аннотации @CreatedBy для созданного Byy и @LastModifiedBy для обновленного By-

@CreatedBy
@Field(value = "createdBy")
private String createdBy;

@LastModifiedBy
@Field(value = "updatedBy")
private String updatedBy; 

Также я использовал @EnableMongoAuditing эту аннотацию в основном приложении.

И создал класс, который реализует AuditorAware, как показано ниже -

@Component
public class UserAudtiting implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {

        String uname = SecurityContextHolder.getContext().getAuthentication().getName();
        return Optional.of(uname);
    }
}

Поэтому, когда я использую какой-то метод post для сохранения данных, я получаю "createBy": null в ответ.

Что я должен сделать для этого? Пожалуйста, помогите!

1 Ответ

0 голосов
/ 29 марта 2019

Чтобы включить аудит, нам нужно добавить конфигурацию Spring.XML или JAVA Config, в любом случае

Spring XML Configuraton

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

Spring Java Configuration

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

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

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

InЧтобы использовать @CreatedBy и @LastModifiedBy, вам нужно сообщить Spring, кто является текущим пользователем.

Сначала добавьте поля, относящиеся к пользователю, в ваш проверяемый класс:

@CreatedBy
private String createdBy;

@LastModifiedBy
private String lastModifiedBy;

Затем создайте реализацию AuditorAware.который получит текущего пользователя (вероятно, из сеанса или в контексте Spring Security - зависит от вашего приложения):

public class UserAudtiting implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
      // get your user name here
      String uname = SecurityContextHolder.getContext().getAuthentication().getName();
      return Optional.of(uname);
    }
}

Последнее, что нужно сказать Spring Data MongoDB об этом классе, осведомленном об аудиторе, путем небольшой модификации в конфигурации Mongo:

<mongo:auditing auditor-aware-ref="auditor" />
<bean id="auditor" class="app.demo.UserAudtiting "/>

Подробнее здесь: https://www.javacodegeeks.com/2013/05/auditing-entities-in-spring-data-mongodb.html

...