J'ai un RestController et quand j'appelle la méthode:
@RequestMapping(value = "/sigla/{sigla}")
@ResponseBody
public PaisDTO obterPorSigla(@PathVariable String sigla) {
return service.obterPorSigla(sigla);
}
Si un enregistrement est trouvé, j'obtiens une bonne réponse JSON:
{"nome":"Brasil","sigla":"BR","quantidadeEstados":27}
mais quand rien n'est trouvé dans la base de données, le RestController retourne null et j'obtiens une réponse vide, corps complètement vide.
Comment afficher un JSON vide au lieu d'une réponse vide? Comme ci-dessous:
{}
Contrôleur complet:
@RestController
@RequestMapping("/pais")
public class PaisController {
@Autowired
private PaisService service;
@RequestMapping
public ResponseEntity<List<PaisDTO>> obterTodos() {
return CreateResponseEntity.getResponseEntity(service.obterTodos());
}
@RequestMapping(value = "/sigla/{sigla}", method = RequestMethod.GET, consumes="application/json", produces="application/json")
public ResponseEntity<PaisDTO> obterPorSigla(@PathVariable String sigla) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
PaisDTO paisDTO = service.obterPorSigla(sigla);
if(paisDTO != null) return new ResponseEntity<PaisDTO>(paisDTO, headers, HttpStatus.OK);
else return new ResponseEntity<PaisDTO>(headers, HttpStatus.OK);
}
Tout d'abord, si vous utilisez @RestController
annotation vous n'avez pas besoin du @ResponseBody
annotation, débarrassez-vous de cela.
Deuxièmement, si vous essayez d'avoir REST Controller, alors vous manquez quelques choses, faites-le comme ceci:
@RequestMapping(value = "/sigla/{sigla}", method = RequestMethod.GET, consumes = "application/json", produces="application/json")
public ResponseEntity<PaisDTO> obterPorSigla(@PathVariable String sigla) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
PaisDTO paisDTO = service.obterPorSigla(sigla);
if(paisDTO != null) return new ResponseEntity<>(paisDTO, headers, HttpStatus.OK);
else return new ResponseEntity<>(headers, HttpStatus.OK);
}
Dans l'exemple ci-dessus, si vous obtenez null, vous retournerez une réponse JSON vide.
La seule façon que j'ai pu trouver était de créer une classe vide
@JsonSerialize
public class EmptyJsonBody {
}
Ajoutez ensuite ceci à votre réponse
@PostMapping(value = "/sigla/{sigla}")
public ResponseEntity obterPorSigla(@PathVariable String sigla) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
PaisDTO paisDTO = service.obterPorSigla(sigla);
ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.ok().headers(headers);
if(paisDTO != null) {
return responseBuilder.body(paisDTO);
} else {
return responseBuilder.body(new EmptyJsonBody());
}
}