Kotlin + Spring Boot 中将实体转换为 DTO 的最佳实践

3

我熟悉几种解决这个问题的方法,但可能我缺少一些真正有用的东西:

我有一个API实体:

data class SomeApiEntity(
    val id: Long? = null,

    @field:NotBlank
    val name: String,

    val someIntData: Long,
)

同时Spring JPA实体:

@Entity(name = "some_entity")
class SomeEntity(
    @field:NotBlank
    @Column(name = "name", nullable = false)
    val name: String,

    @Column(name = "some_int_data", nullable = false)
    val someIntData: Long,
) {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    var id: Long? = null
}

现在我需要想出一种将这些实体从一种转换为另一种的方法。
最流行的解决方案是在这些实体中实现以下方法: SomeApiEntity 中的一个示例:
fun toApiEntity(): SomeApiEntity = SomeApiEntity(
        id,
        name,
        intData,
    )

还有一个在SomeEntity类中的。

fun toEntity(): SomeEntity = SomeEntity(
        name,
        intData
    )

但我发现这种解决方案不成功且可扩展性差。
对于大型实体,特别是具有转换逻辑的实体,尤其是如果其他Spring Beans在那里使用,就可以进行测试。好吧,像这样的小实体与大实体变得统一了。
我知道在Spring中实现Converter<S,T>接口的解决方案,但它也不好,因为它只解决了单向转换,并且在未来需要编写的代码量上增加了一些额外开销。

如果我的回答对你有帮助,或者根据你的问题是正确的,请考虑接受它 :) - undefined
1个回答

2

我不确定在Spring上是否有最佳实践,但在Android开发中,我倾向于不在类本身上创建这些方法(例如,在Entity类上创建将Entity转换为DTO的方法)。我不这样做的原因是我会紧密耦合这两个类,并且我也不认为Entity应该知道如何将自己映射到域和反之亦然。

我的做法通常是创建一个扩展函数来完成相同的操作,但在单独的文件中,就像这样:

fun SomeDTO.toApiEntity() = SomeApiEntity(
   id = id,
   name = name,
   intData = intData,
)

你可以像测试其他方法一样进行测试:

@Test
fun `GIVEN SomeDTO object WHEN toSomeApiEntity called THEN must return SomeEntity with same values`() {
   // GIVEN
   val name = "Jonh"
   val id = 1L
   val intData = 254

   val someDTO = SomeDTO(id = id, name = name, intData = intData)
   val expectedSomeEntity = SomeEntity(id = id, name = name, intData = intData)

   // WHEN
   val actualSomeEntity = someDTO.toSomeApiEntity()

   // THEN
   Assert.AsserEquals(expectedSomeEntity.id, actualSomeEntity.id)
   Assert.AsserEquals(expectedSomeEntity.name, actualSomeEntity.name)
   Assert.AsserEquals(expectedSomeEntity.intData, actualSomeEntity.intData)
}

如果您的 SomeApiEntity 类是一个数据类,并且它的所有属性也都是数据类,那么您可以简化断言,像这样:
Assert.AsserEquals(expectedSomeEntity, actualSomeEntity)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接