web-dev-qa-db-fra.com

Spring Boot: retourne un JSON vide au lieu d'un corps vide lorsque l'objet retourné est nul

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);
    }
10

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.

5
Moshe Arad

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());
    }
}
0
Marcos Almeida