Estou criando um serviço REST com Spring Boot e estou tendo problemas no ponto em que converto solicitações JSON/DTOs para as entidades correspondentes, especificamente quando uma entidade contém uma referência a outra entidade. Digamos que temos esses objetos, por exemplo:
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,
)
O aplicativo tem camadas controlador-serviço-repositório e, até onde sei, devo executar a conversão DTO -> entidade na camada controladora e, em seguida, passar a entidade resultante para a camada de serviço. No entanto, para converter o DTO de solicitação de livro em uma entidade, primeiro preciso buscar a entidade Autor apropriada do repositório com base no authorId
. Minha pergunta é: onde exatamente devo fazer isso?
Dado que a camada de serviço deve aceitar apenas entidades, parece que eu deveria fazer a busca do autor na camada do controlador. Mas isso significaria que o controlador Book precisaria ter acesso à camada de serviço Author, e é isso que não tenho certeza se é uma boa prática.
Aqui está o que quero dizer (usando funções de extensão óbvias para fazer as conversões de DTO/entidade)
@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)
}
}
Essa é a maneira usual de fazer isso ou misturar vários serviços em um controlador é uma má ideia? Eu claramente tenho que acessar o repositório do autor em algum lugar , só não sei qual seria o melhor lugar. Existe uma maneira melhor?