我正在使用 Spring Boot 创建一个 REST 服务,但在将 JSON 请求/DTO 转换为相应实体时遇到了麻烦,特别是当一个实体包含对另一个实体的引用时。例如,假设我们有这些对象:
data class BookEntity(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int?,
val name: String,
@ManyToOne
@JoinColumn(name = "author_id")
val author: AuthorEntity,
)
data class AuthorEntity(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int?,
val name: String,
)
data class BookRequestDto(
val name: String,
val authorId: Int,
)
该应用程序具有控制器-服务-存储库层,据我所知,我应该在控制器层中执行 DTO -> 实体转换,然后将生成的实体传递给服务层。但是,为了将图书请求 DTO 转换为实体,我首先必须根据给定的从存储库中获取适当的 Author 实体authorId
。我的问题是:我到底应该在哪里做这件事?
鉴于服务层应该只接受实体,看来我应该在控制器层中获取作者。但这意味着 Book 控制器需要访问 Author 服务层,我不确定这是否是好的做法。
这就是我的意思(使用明显的扩展函数来执行 DTO/实体转换)
@RestController
@RequestMapping(path = ["/books"])
class BookController(
private val bookService: BookService,
private val authorService: AuthorService,
) {
@PostMapping
fun createBook(@RequestBody bookDto: BookRequestDto): ResponseEntity<BookResponseDto> {
val author = authorService.get(bookDto.authorId)
val bookEntity = bookDto.toBookEntity(author = author)
val createdBook = bookService.create(bookEntity)
return ResponseEntity(createdBook.toBookResponseDto(), HttpStatus.CREATED)
}
}
这是通常的做法吗?还是在控制器中混合多个服务是个坏主意?我显然必须在某个地方访问作者存储库,但我不知道最佳位置在哪里。有没有更好的方法?