如何实现PersonDTO中空字符串自动转为null映射至Person实体?
解决方案:将空字符串转为null后持久化
有几种可行的实现方式,按需选择:
1. 直接在持久化代码中做判断
利用Kotlin的takeIf函数,当字符串非空时返回自身,否则返回null,直接嵌入到实体构造逻辑里:
personRepository.save( Person( firstName = personDto.firstName.takeIf { it.isNotEmpty() }, lastName = personDto.lastName.takeIf { it.isNotEmpty() } ) )
2. 封装转换逻辑到扩展函数
如果需要多处复用这个转换规则,可以给PersonDTO写一个扩展函数,把转换逻辑统一封装:
fun PersonDTO.toPerson(): Person { return Person( firstName = firstName.takeIf { it.isNotEmpty() }, lastName = lastName.takeIf { it.isNotEmpty() } ) }
后续持久化时直接调用这个函数即可:
personRepository.save(personDto.toPerson())
3. 修改DTO的属性获取逻辑(谨慎使用)
如果允许调整PersonDTO的结构,可以通过自定义getter让属性自动返回null(当原字符串为空时):
data class PersonDTO( val id: Long?, private val _firstName: String, private val _lastName: String, ) { val firstName: String? get() = _firstName.takeIf { it.isNotEmpty() } val lastName: String? get() = _lastName.takeIf { it.isNotEmpty() } }
这样直接访问personDto.firstName时,空字符串会自动转为null。但要注意这种方式会改变DTO的序列化行为(比如JSON序列化时会输出处理后的值),如果DTO需要和外部系统交互,可能需要额外配置序列化框架(如Jackson)来兼容。
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

