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
相关产品推荐
相关产品推荐

