我在 postgresql 数据库中有一些限制(唯一的、外键...)。
我使用 spring data r2dbc 存储库:ReactiveCrudRepository
我想将DataIntegrityViolationException存储库的抛出转换为基于 的constraintNameinErrorDetails字段的自定义异常PostgresqlDataIntegrityViolationException。
但ExceptionFactory包含该类的类PostgresqlDataIntegrityViolationException是包私有的。所以我无法投射DataIntegrityViolationExceptionto的原因异常PostgresqlDataIntegrityViolationException。
constraintName当我捕获 时,访问 的最干净的方法是什么DataIntegrityViolationException?
(比解析异常消息更好的事情^^)
编辑 :
我以这个解决方案结束:
val DataIntegrityViolationException.pgErrorDetails: ErrorDetails
get() = when(val cause = this.cause) {
null -> error("cause should not be null")
else -> cause.javaClass
.getDeclaredField("errorDetails")
.apply { isAccessible = true }
.let { it.get(cause) as ErrorDetails }
}
Run Code Online (Sandbox Code Playgroud)