Сохранить в ReactiveCrudRepository, не вставляя и не обновляя записи - PullRequest
0 голосов
/ 21 марта 2020

Как указано в заголовке, я не смог вставить или обновить записи в моей базе данных Postgres. Я только начал работать с пружиной и kotlin, так что может быть какая-то довольно базовая конфигурация c, которой она не хватает. Заранее спасибо

Вот моя база кода

UserRepository

@Repository
interface UserRepository : ReactiveCrudRepository<User, Int> {}

Модель пользователя @Table ("user_app" )

data class User (
    @Id
    @Column("id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    val id : Int? =  null,

    @Column("username")
    val username : String?,

    @Column("email")
    val email : String?,

    @Column("name")
    val name : String?,

    @Column("password")
    val password : String?
)

UserController @ Component

class UserController{

    @Autowired
    private lateinit var userRepository : UserRepository

    fun getAllUsers() : Flux<User> = userRepository.findAll()

    fun getUserById( userId: Int) : Mono<User> = userRepository.findById(userId)

    fun createUser(user: User): Mono<User> = userRepository.save(user)

    fun updateUser(user: User) : Mono<User> = userRepository.save(user)

}

UserConfiguration

@Configuration
class UserConfiguration {

    @FlowPreview
    @Bean
    fun userRouter(controller: UserController): RouterFunction<ServerResponse> = router{
        ("/users").nest{
            GET("") { _ ->
                ServerResponse.ok().body(controller.getAllUsers())
            }

            GET("/{id}") { req ->
                ServerResponse.ok().body(controller.getUserById(req.pathVariable("id").toInt()))
            }

            accept(MediaType.APPLICATION_JSON)
            POST("") {req ->
                ServerResponse.ok().body(req.bodyToMono(User::class.java).doOnNext { user ->
                        controller.createUser(user)                })
            }

            accept(MediaType.APPLICATION_JSON)
            PUT("") {req ->
                ServerResponse.ok().body(req.bodyToMono(User::class.java).doOnNext { user ->
                    run {
                        controller.updateUser(user)
                    }
                })
            }
        }
    }
}

R2dbcConfiguration

@Configuration
@EnableR2dbcRepositories
class R2dbcConfiguration  : AbstractR2dbcConfiguration() {
    @Bean
    override fun connectionFactory(): PostgresqlConnectionFactory  {
        val config = PostgresqlConnectionConfiguration.builder()
                .host("localhost")
                .port(5432)
                .database("postgres")
                .username("postgres")
                .password("pass123")
                .build()

        return PostgresqlConnectionFactory(config)

    }

}

1 Ответ

0 голосов
/ 25 марта 2020

Узнал, почему это не работает. Сохранить не сохраняет изменения в базе данных, для этого нужно вызвать несколько методов. Я вызвал подписку, но поскольку это блокирующий метод, я запустил его либо в блоке let, либо в doOnNext

fun createUser(request: ServerRequest): Mono<ServerResponse> {
        println("createUser")
        val badRequest = ServerResponse.badRequest().build()
        val user = request.bodyToMono(User::class.java)

        return user
                .doOnNext { u -> userRepository.save(u).subscribe() }
                .flatMap {
                    ServerResponse.ok().contentType(APPLICATION_JSON).body(fromValue(it))
                }
    }
...