Kotlin Spring JPA Reactive 克服默认异常

Kotlin Spring JPA Reactive overcoming the default exception

我遇到了一个问题, 当数据库查询中有唯一约束时,

然后又想插入, 我想覆盖默认异常。

像这样的 DB table

CREATE TABLE IF NOT EXISTS $ENROLLED_USERS_TABLE (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    $USERS_FIELD VARCHAR(250) NOT NULL UNIQUE
                );

和这样的回购协议

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

    @Modifying
    @Query("insert into $ENROLLED_USERS_TABLE ($USERS_FIELD) values (:user)")
    fun insertUser(@Param("user") user: String?): Mono<Void?>?
}

这是我的控制器

@PostMapping("/{user}")
    suspend fun add(@PathVariable user:String): Void? = userRepository.insertUser(user)?.awaitFirstOrNull()

我试过将它们放在 try and catch 中,但没有成功 赶上

@Service
class UserService(val userRepository: UserRepository) {

    suspend fun add(user:String) {
        try {
            // some code
            userRepository.insertUser(user)?.onErrorReturn(throw ResourceAlreadyExists("User Already exists"))

        }
        catch (e: SQLException) {
            println("Custome Message")
        }
    }
}

没有任何效果我仍然得到显示我的数据库查询的异常:/

解决方法很简单

@PostMapping("/{user}")
    suspend fun add(@PathVariable user:String): Void? = userRepository.insertUser(user)?.onErrorMap { throw ResourceAlreadyExists("User Already Exists") }?.awaitFirstOrNull()

映射错误是正确的