在一个Spring Boot项目中,我使用像@CreatedDate这样的注释来保存关于相应文档创建/更新日期的信息。ZonedDateTime在整个项目中使用,因此带注释的字段也是ZonedDateTime。为了实现Mongo的日期格式和ZonedDateTime之间的转换,使用了自定义转换器。
现在,当使用Spring Boot 1.5.x时,自定义转换器可以完美地用于可审计字段。在Spring Boot 2.0.x中,自定义转换器适用于所有字段,但不适用于可审核字段。因此,如果我删除@EnableMongoAuditing,一切正常(整个项目中的所有ZonedDateTime字段都保留到Mongo并正确从Mongo读取),但创建/更新的日期字段为空。如果我启用 mongo 审核,则在尝试保存文档时会出现以下异常:
java.lang.IllegalArgumentException: Invalid date type for member <MEMBER NAME>!
Supported types are [org.joda.time.DateTime, org.joda.time.LocalDateTime, java.util.Date, java.lang.Long, long]
我的Mongo配置:
@Configuration
@EnableMongoAuditing
public class MongoConfig {
@Bean
public MongoCustomConversions customConversions(){
List<Converter<?,?>> converters = new ArrayList<>();
converters.add(new ZonedDateTimeToDateConverter());
converters.add(new DateToZonedDateTimeConverter());
return new MongoCustomConversions(converters);
}
}
以下是相应字段的外观:
abstract class BaseModel {
@Id
private String id;
@CreatedDate
private ZonedDateTime created;
@LastModifiedDate
private ZonedDateTime updated;
}
有没有办法让转换器适用于 mongo 可审计字段,除了降级到 Spring Boot 1.5.x?
除了注册一个MongoCustomConversions
bean之外。创建DateTimeProvider
的bean,并将其注册到您的@EnableXXXAuditing(datetimeprovisiderref=“DateTimeProvider”)
public class CustomDateTimeProvider implements DateTimeProvider {
@Override
public Optional<TemporalAccessor> getNow() {
return Optional.of(ZonedDateTime.now());
}
}
@Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeProvider") // beanName
public class MongoConfig {
@Bean
public MongoCustomConversions customConversions(){
List<Converter<?,?>> converters = new ArrayList<>();
converters.add(new ZonedDateTimeToDateConverter());
converters.add(new DateToZonedDateTimeConverter());
return new MongoCustomConversions(converters);
}
// The DateTimeProvider bean with beanName="dateTimeProvider" is registered here
@Bean
public DateTimeProvider dateTimeProvider() {
return new CustomDateTimeProvider();
}
}
当您使用@EnableXXXAuditing
时,Spring将注册一个AuditHandler,负责将审核数据添加到您的模型中。它有两个主要组件:DateTimeProvider和AuditorAware
@EnableXXXAuditing(
auditorAwareRef = "auditorAware", // beanName
dateTimeProviderRef = "dateTimeProvider" // beanName
)
@CreatedDate
和@LastModifiedDate
@CreatedBy
和@LastModifiedBy
DateTimeProvider
的默认实现是CurrentDateTimeProvider,它返回LocalDateTime
。这就是为什么您的ZonedDateTime
CreatedDate、LastModifiedDate出现错误的原因。
我正在使用Spring Mongo审计和@CreatedDate@CreatedBy不工作,但@LastModifiedDate和@LastModifiedBy工作正常。 我在配置类上添加了@EnableMongoAudting,并定义了AuditAware。 审核类别为: 当我保存文档时,它在createdOn和createdBy中都设置为null,但在modifiedOn和modifiedBy
我正在构建一个Spring启动应用程序。我对这项技术还很陌生。我已经看到了许多关于如何启用审计的示例。我似乎已经遵循了所需的配置和设置。但是在标记lastModifiedBy的“更新”操作期间,审计不起作用 以下是我在项目中的代码。 实体-我ssue.java 一个uditable.java 审核配置。JAVA AuditAwareImpl。JAVA IssueController。JAVA 发行
通过选择,,和,我创建了一个全新的Spring初始化项目。 我做了一个小项目: 我试着将三个人保存到数据库中。保存方法只返回需要执行的Mono。如果我尝试通过简单的订阅来执行它,一切都很好: 但是,当我使用而不是时,应用程序挂起: 如果我手动查询数据库,我会看到Jim已被保存,但Jack和John未被保存。 这是窃听器,还是我做错了什么?我希望在代码进一步发展之前保证用户在数据库中,所以我真的很想
我试着用Springboot2做一些测试,特别是用Reactor(Flux/Mono)。我面临一个问题。 当我尝试使用一个存储库方法做检索我所有的人我使用该方法:@Tailable Flux findRetTailableCursorBy(); 但就我而言,我收到了这个错误 当我将我的收藏设置为“封顶”时,它就起作用了 但出于很多原因,我不会使用封顶系列 无法删除文档(必须删除收藏) 无法通过编程
问题内容: 我正在使用NHibernate,并且正在寻找一种解决方案,该解决方案将允许我审核实体中所有字段的更改。我希望能够为每个实体(例如,用户-> UsersHistory)创建一个历史表,该表将具有与用户表相同的结构,并具有其他字段,例如操作类型(更新,删除),进行更改的用户的userid等。不想为每个实体定义此类。我正在寻找类似的东西(即),因为这些条目不属于我的域,仅用于准备对该实体所做
问题内容: 我已经测试了elasticsearch突出显示字段功能,并且工作正常。我使用了 elasticsearch2.4.4 和 spring-data- elasticsearch-2.0.0.RELEASE 我最近将 elasticsearch 升级到 5.5.0 和 spring-data-elasticsearch-3.0.0.M4 当我测试相同的代码时,突出显示不会发生 下面是示例代