【问题标题】:Save in ReactiveCrudRepository not inserting or updating records保存在 ReactiveCrudRepository 中,不插入或更新记录
【发布时间】:2020-07-02 03:14:52
【问题描述】:

如标题所述,我无法在我的 Postgres 数据库中插入或更新记录。 我刚开始使用 spring 和 kotlin,所以可能缺少一些非常基本的配置。提前致谢

这是我的代码库

用户存储库

@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?
)

用户控制器 @组件

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)

}

用户配置

@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)
                    }
                })
            }
        }
    }
}

R2dbc配置

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

    }

}

【问题讨论】:

    标签: postgresql kotlin reactive-programming spring-data-r2dbc r2dbc


    【解决方案1】:

    找出这不起作用的原因。 Save 不会持久化数据库中的更改,为此您需要调用一些方法。我调用了 subscribe 但因为这是一个阻塞方法,所以我在 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))
                    }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2020-11-21
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多