Android 处理来自客户端的Rest sql异常

Android 处理来自客户端的Rest sql异常,android,spring-boot,exception,retrofit2,Android,Spring Boot,Exception,Retrofit2,我正在使用spring boot和android 我正在尝试使用post创建用户。对于积极的情况,它可以正常工作,但在消极的情况下,例如主键冲突,服务器抛出sql异常 我想显示错误消息“客户端用户已存在”这是一个验证检查场景,不是异常处理案例。您需要添加验证检查: ->首先检查数据库中是否存在用户,如果存在则抛出错误 当我们从用户那里获得输入时,我们添加了验证检查。 当代码或受信任的客户机中可能出现错误时(如不涉及用户输入的UI应用程序逻辑),我们会执行异常处理 用于处理异常并向客户端抛出一些消

我正在使用spring boot和android

我正在尝试使用post创建用户。对于积极的情况,它可以正常工作,但在消极的情况下,例如主键冲突,服务器抛出sql异常


我想显示错误消息“客户端用户已存在”

这是一个验证检查场景,不是异常处理案例。您需要添加验证检查:
->首先检查数据库中是否存在用户,如果存在则抛出错误

当我们从用户那里获得输入时,我们添加了验证检查。 当代码或受信任的客户机中可能出现错误时(如不涉及用户输入的UI应用程序逻辑),我们会执行异常处理

用于处理异常并向客户端抛出一些消息。我们需要使用
@ControllerAdvice

教程:

Spring文档:

这只是基于我在生产中的代码的模型(很抱歉使用Kotlin,您可以将其重新格式化为Java):

  • 创建统一的响应格式
  • 作为响应返回控制器内部
  • 创建用户,如果错误抛出在自定义异常之上
  • 捕获消息并从Android向用户显示

  • 希望它有帮助

    重新编写,但需要来自原始询问者的进一步代码来提供帮助。我没有实现我只是实现了正常的post方法我不知道怎么做,我只是想知道怎么做?我尝试了这个方法,但在使用rest api客户端(如postman或失眠)时,消息字段是空的,如果消息显示,然后检查您的改装代码
    data class Response @JsonCreator constructor (
        var message: String? = "",
        var success: Boolean = false,
        var data: Any? = null
    )
    
    @PostMapping
    fun createUser(@ResponseBody newUser): ResponseEntity<Response> {
        return ResponseEntity(
            Response(
                "Create user: ",
                true,
                this.userService.createUser(newUser)
            ),
            HttpStatus.OK
        )
    }
    
    class ResourceNotFoundException: RuntimeException {
        var statusCode: Int? = null
    
        constructor(errorMessage: String, statusCode:Int): super(errorMessage) {
            this.statusCode = statusCode
        }
        constructor(errorMessage: String, cause: Throwable, statusCode: Int): super(errorMessage, cause) {
            this.statusCode = statusCode
        }
    }
    
    fun createUser(newUser: UserEntity): Boolean { // can be replaced by any response
        try {
            this.userRepository.save(newUser)
        } catch (e: DuplicateKeyException) {
            throw ResourceNotFoundException(
                "Client user already exists",   // custom http message
                "404"  // custom http status
            )
        }
        return true
    }
    
    showToast(response.message)