Kotlin SpringBoot插入枚举数据报Parameter specified as non-null is null错误如何解决
错误根因
该空指针异常出现在Spring请求参数绑定阶段,未执行到Service层,和枚举全局默认值无关:
ReqWork类中materialType、fIxWork两个枚举字段被声明为Kotlin非空类型,未设置默认值- 使用
@ModelAttribute接收请求时,若前端未传对应枚举参数、或传入的枚举值和定义的枚举类枚举项不匹配,Spring会给这两个字段赋值null,触发Kotlin非空类型约束校验失败,直接抛出空指针异常。
枚举默认值说明
Kotlin中枚举属于引用类型,不存在全局默认值,只有显式给字段指定默认枚举项,该字段才会有默认值。未设置默认值的非空枚举字段,被赋值null时就会触发空指针。
解决方案
方案1:给请求类枚举字段设置默认值
修改ReqWork.kt为两个枚举字段指定默认枚举项:
data class ReqWork ( val userId:Long=-1, @Enumerated(EnumType.STRING) @Column(nullable = false) val materialType: MaterialType = MaterialType.自定义默认枚举项, @Enumerated(EnumType.STRING) @Column(nullable = false) val fIxWork: FIxWork = FIxWork.自定义默认枚举项, val pieces:Int=0, val workDate: LocalDateTime = LocalDateTime.now(), )
方案2:改为可空类型+手动校验
如果枚举参数为必填项,可将字段改为可空类型,在业务代码中添加参数校验逻辑:
data class ReqWork ( val userId:Long=-1, @Enumerated(EnumType.STRING) @Column(nullable = false) val materialType: MaterialType?, @Enumerated(EnumType.STRING) @Column(nullable = false) val fIxWork: FIxWork?, val pieces:Int=0, val workDate: LocalDateTime = LocalDateTime.now(), )
在Controller或Service层判断字段为null时返回参数错误提示即可。
方案3:修改参数接收方式
若接口接收JSON格式参数,可将Controller中@ModelAttribute改为@RequestBody,Spring的JSON序列化器会在枚举值缺失/不匹配时返回更明确的参数错误提示,避免直接抛出空指针。
内容的提问来源于stack exchange,提问作者Mama
相关产品推荐
相关产品推荐

