我有一个问题,当数据库查询中有唯一约束时,
然后要再次插入,我想覆盖默认例外。
就像有这样的数据库表时一样
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()
我曾尝试将其试捕,但没有成功赶上
@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()
映射错误是正确的一个