Estou aprendendo a sobre REST API e possuo uma dúvida.
No meu método desse end point, tenho
produces = MediaType.IMAGE_PNG_VALUE)
No retorno no meu endpoint tenho
.contentType(MediaType.IMAGE_PNG)
A dúvida é qual a diferença desse dois?
/*Método que recupera a foto*/
@GetMapping(produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<InputStreamResource> servirFoto(@PathVariable Long restauranteId, @PathVariable Long produtoId) {
try {
FotoProduto fotoProduto = catalogoFotoProdutoService.buscarOuFalhar(restauranteId, produtoId);
InputStream inputStream = fotoStorage.recupear(fotoProduto.getNomeArquivo());
return ResponseEntity.ok()
.contentType(MediaType.IMAGE_JPEG)
.body(new InputStreamResource(inputStream));
} catch (FotoProdutoNaoEncontradaException e) {
return ResponseEntity.notFound().build();
}
}
A diferença é que MediaType.IMAGE_PNG_VALUE é do tipo String e MediaType.IMAGE_PNG é do tipo MediaType.
Eles são equivalentes um ao outro e qual usar depende do contexto.
O elemento produces da anotação GetMapping é do tipo String[], então vc tem que usar MediaType.IMAGE_PNG_VALUE. Já o parâmetro do método contentType do builder de ResponseEntity é do tipo MediaType, então vc tem que usar MediaType.IMAGE_PNG.
Ter uma classe como a MediaType é melhor porque nos permite ter maior controle sobre os valores aceitos e nos permite ter métodos auxiliares, porém, ter o equivalente String é importante por causa de uma limitação no tipo de retorno suportado por métodos declarados em uma anotação em Java.
O retorno destes métodos só pode ter um dos seguintes tipos:
- Qualquer tipo primitivo
- String
- Class
- Enum
- Outra anotação
- Um array cujo tipo dos componentes sejam um dos listados acima
Fonte: Chapter 9. Interfaces
Ou seja, isto é aceito:
@interface GetMapping {
String produces();
}
Mas isto dá erro de compilação (error: invalid type for annotation type element):
@interface GetMapping {
MediaType produces();
}
1 curtida