postgresql - 保存在 ReactiveCrudRepository 中,不插入或更新记录
问题描述
如标题中所述,我无法在我的 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)
}
}
解决方案
找出为什么这不起作用。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))
}
}
推荐阅读
- swift - 使用 enumerateBodies 沿RayStart 反弹光线
- android - Google Play 开发者 API | 检索评论
- asp.net - DotNet HighCharts 在 Web 表单中导出 Asp.net
- python - Python、QT 和 pyQt 图形用户界面
- r - 使用 faceted geom_col 和 position="fill" 为 geom_text 创建比例数字
- xquery - eXistDB 性能问题——如何改进?
- html - 向网站添加响应式页脚。页脚位于母版页上,应显示在每个内容页上
- javascript - 如何在不更改文本内容的情况下使用拆分
- php - 通过邮递员发送文件
- php - Guzzle6 中的 URI 模板?