Duvida sobre MediaType do meu endPoint

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