Estou participando do Challange de backend, onde dicidi construir a api em java com Spring Boot, e estou com dificuldades para trabalhar com o arquivo de imagens. A api deve trabalhar com os seguintes campos:
- Nome do usuário
- Foto do usuário
- Depoimento
Escolhi para trabalhar com as imagens o tipo MultipartFile
, não sei se é a melhor escolha, mas funcionou para receber as informações na rota de cadastrar, onde enviei as informações para a rota no controller com o Content-Type sendo multipart/form-data
, recebo as informações através de um dto, crio a entidade e salvo ela no banco de dados MySql.
No campo de foto no MySql utilizei o tipo BLOB.
Porém para retornar estou com problemas em serializar o tipo MultiPartFile, o jackson não esta conseguindo fazer essa função por padrão.
Gostaria de saber se existe uma forma simples para serializar essa informação, ou se posso retornar o tipobyte[]
sem transforma-lo no tipo MultiPartFile (já que esse é o tipo retornado do banco de dados da coluna BLOB)?
Procurei algumas soluções, e uma delas sugere criar um serializador personalizado para o tipo MultiPartFile, mas acredito que seja um pouco complicado essa opção.
Abaixo tem a rota para listar do controller:
@GetMapping
public ResponseEntity<Page<ListTestimonialDto>> listTestimonial(
@PageableDefault(size = 10, sort = { "name" }) Pageable pagination) {
var dto = repositoryTestimonial.findAll(pagination).map(ListTestimonialDto::new);
return ResponseEntity.ok(dto);
}
E o DTO para listar os depoimentos:
public record ListTestimonialDto(
Long id,
String name,
@JsonSerialize(using = ByteArraySerializer.class)
MultipartFile picture,
String testimonial) {
public ListTestimonialDto(Testimonial entity) {
this(entity.getId(), entity.getName(),
new ByteArrayMultipartFile(entity.getPicture()), entity.getTestimonial());
}
}
Após adicionar o @JsonSerialize(using = ByteArraySerializer.class)
no campo picture a aplicação retornou o erro abaixo, e antes de fazer esse anotação a aplicação apenas informava que não encontrou um serializador para o tipo MultipartFile.
Could not write JSON: class com.___.ByteArrayMultipartFile cannot be cast to class
[B (com.___.ByteArrayMultipartFile is in unnamed module of loader
org.springframework.boot.devtools.restart.classloader.RestartClassLoader @59a7eda0;
[B is in module java.base of loader 'bootstrap')