Quando usamos a anotação @RestController em nossa classe de controle de API, o Spring sempre retorna um JSON como resposta. Isso acontece automaticamente toda vez que um “cliente” faz uma solicitação sem enviar um cabeçalho “Accept” com o tipo de retorno desejado.
Um exemplo de método em uma classe controller é o seguinte:
@GetMapping("/test")
public ResponseEntity<TestDTO> test() {
return ResponseEntity.ok(testService.test());
}
Nesse caso, o Spring converte o objeto da classe TestDTO em um JSON usando a biblioteca Jackson. No entanto, se um cabeçalho “Accept” for enviado com o valor “application/xml”, o retorno será um XML.
Para alterar o tipo de retorno padrão quando nenhum cabeçalho explícito é enviado na solicitação, podemos usar a propriedade “produces” nas anotações, como o @RequestMapping ou suas variações (@GetMapping, @PostMapping, etc.). Por exemplo:
@GetMapping(produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<TestDTO> test() {
return ResponseEntity.ok(testService.test());
}
Isso precisará ser feito em todos os métodos de sua API.
Para mudar o retorno padrão de toda a aplicação você pode configurar o WebMvcConfigurer dessa forma:
@Bean
public WebMvcConfigurer customConfigurer() {
return new WebMvcConfigurer() {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
};
}
ou
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
}