You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot(Kotlin)中ResponseEntity返回ValidationError属性缺失问题

问题根源

你遇到的问题是因为ValidationError类的字段是private修饰且没有暴露访问接口,Jackson序列化框架无法读取这些私有字段的值,所以最终返回的JSON里errors数组元素是空对象。调试时能看到数据是因为JVM允许直接访问类的私有成员,但序列化框架遵循JavaBean规范,需要getter方法或者公开的字段才能读取数据。

解决办法

这里提供几种简单有效的修复方式:

方式1:把ValidationError改成data class(推荐)

Kotlin的data class会自动为所有属性生成public的getter方法,Jackson可以正常识别并序列化:

@JsonInclude(JsonInclude.Include.NON_NULL)
class ErrorResponse(
    val status: Int = 0,
    val message: String? = null,
    var stackTrace: String? = null,
    var errors: MutableList<ValidationError>? = null,
) {
    // 改成data class
    data class ValidationError(
        val field: String? = null,
        val message: String? = null
    )

    fun addValidationError(field: String?, message: String?) {
        if (Objects.isNull(errors)) {
            errors = ArrayList()
        }
        errors!!.add(ValidationError(field, message))
    }
}

方式2:给私有字段加@JsonProperty注解

如果不想改动类的结构,直接给ValidationError的私有字段加上@JsonProperty注解,告诉Jackson这两个字段需要被序列化:

@JsonInclude(JsonInclude.Include.NON_NULL)
class ErrorResponse(
    val status: Int = 0,
    val message: String? = null,
    var stackTrace: String? = null,
    var errors: MutableList<ValidationError>? = null,
) {
    class ValidationError(
        @JsonProperty("field")
        private val field: String? = null,
        @JsonProperty("message")
        private val message: String? = null
    )

    fun addValidationError(field: String?, message: String?) {
        if (Objects.isNull(errors)) {
            errors = ArrayList()
        }
        errors!!.add(ValidationError(field, message))
    }
}

方式3:将字段改为公开(不推荐)

直接去掉private修饰符,让字段变成public,Jackson也能正常读取:

@JsonInclude(JsonInclude.Include.NON_NULL)
class ErrorResponse(
    val status: Int = 0,
    val message: String? = null,
    var stackTrace: String? = null,
    var errors: MutableList<ValidationError>? = null,
) {
    class ValidationError(
        val field: String? = null,
        val message: String? = null
    )

    fun addValidationError(field: String?, message: String?) {
        if (Objects.isNull(errors)) {
            errors = ArrayList()
        }
        errors!!.add(ValidationError(field, message))
    }
}
修复后的效果

修改完成后,再次发送验证失败的请求,响应会正确输出错误详情:

{
    "status": 422,
    "message": "Validation error. Check 'errors' field for details.",
    "errors": [
        {"field": "username", "message": "Please add a username"},
        {"field": "password", "message": "Please add your password"}
    ]
}

内容的提问来源于stack exchange,提问作者lmr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:19:53