Spring data mon go реактив по-прежнему не поддерживает реактив AuditorAware
, поэтому он не может заполнить createdBy
и lastModifiedBy
автоматически.
Я создал ReactiveBeforeConvertCallback
bean для обработки обратных вызовов.
bean {
ReactiveBeforeConvertCallback<Post> { entity, collection ->
println("ReactiveBeforeConvertCallback.onBeforeConvert called...")
val user = ReactiveSecurityContextHolder.getContext()
.map { it.authentication }
.filter { it != null && it.isAuthenticated }
.map { it.principal }
.cast(UserDetails::class.java)
.map { Username(it.username) }
.switchIfEmpty { Mono.empty() }
val currentTime = LocalDateTime.now()
val ent: Post = if (entity.id == null) {
entity.copy(
createdDate = currentTime,
lastModifiedDate = currentTime
)
} else {
entity.copy(
lastModifiedDate = currentTime
)
}
Mono.just(ent)
.flatMap { ent ->
user.map { user ->
if (ent.id == null) {
ent.copy(
createdBy = user,
lastModifiedBy = user
)
} else {
ent.copy(
lastModifiedBy = user
)
}
}.defaultIfEmpty(
if (ent.id == null) {
ent.copy(
createdBy = null,
lastModifiedBy = null
)
} else {
ent.copy(
lastModifiedBy = null
)
}
)
}
}
}
Документ Post
определяется следующим образом.
@Document
data class Post(
@Id val id: String? = null,
var title: String? = null,
var content: String? = null,
val status: Status = Status.DRAFT,
var createdDate: LocalDateTime = LocalDateTime.now(),
var lastModifiedDate: LocalDateTime = createdDate,
var createdBy: Username? = null,
var lastModifiedBy: Username? = null
)
У меня есть еще один Comment
документ , определенный следующим образом .
@Document
data class Comment(
@Id var id: String? = null,
var content: String? = null,
val post: PostId,
val createdDate: LocalDateTime = LocalDateTime.now(),
var lastModifiedDate: LocalDateTime = createdDate,
val createdBy: Username? = null,
var lastModifiedBy: Username? = null
)
Я хочу извлечь общие поля в базовый класс PersitentEntity
.
sealed class PersistentEntity(
open val id: String?,
open val createdDate: LocalDateTime,
open val createdBy: Username?,
open var lastModifiedDate: LocalDateTime,
open var lastModifiedBy: Username?
)
И я хочу установить ReactiveBeforeConvertCallback
для отслеживания PersistentEntity
, который должен влиять на все подклассы.
Вопрос в следующем:
- В запечатанных классах нет метода
copy
, я должен определить его сам, и я должен переопределить его в классах данных? - Если наследует от запечатанного класса, я должен установить
override
для общих полей в классах данных, и я должен установить стратегии доступа к полям?
Как обращаться с этими изящно в Kotlin и Spring Data Mon go?