Kotlin проект наследования классов данных в пн go Документ - PullRequest
0 голосов
/ 20 января 2020

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, который должен влиять на все подклассы.

Вопрос в следующем:

  1. В запечатанных классах нет метода copy, я должен определить его сам, и я должен переопределить его в классах данных?
  2. Если наследует от запечатанного класса, я должен установить override для общих полей в классах данных, и я должен установить стратегии доступа к полям?

Как обращаться с этими изящно в Kotlin и Spring Data Mon go?

...