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