findById

Como é possivel ver no método nós utilizamos um Id como parâmetro, bem como um Product. Daí é o de sempre, criar um existingId e nonExistingId + uma instância de Product.

Podemos criar uma ProductFactory também. Destacando que o Product possui uma Category, então dentro da ProductFactory, podemos utilizar também a CategoryFactory!

@Transactional(readOnly = true)
public ProductDTO findById(Long id) {
    Product product = repository.findById(id).orElseThrow(
            () -> new ResourceNotFoundException("Recurso não encontrado"));
    return new ProductDTO(product);
}

Atualizado