web-dev-qa-db-ja.com

Spring Boot:返されたオブジェクトがnullの場合、空の本文ではなく空のJSONを返す

RestControllerがあり、メソッドを呼び出すと:

@RequestMapping(value = "/sigla/{sigla}")
@ResponseBody
public PaisDTO obterPorSigla(@PathVariable String sigla) {
    return service.obterPorSigla(sigla);
}

レコードが見つかった場合、適切なJSON応答が返されます。

{"nome":"Brasil","sigla":"BR","quantidadeEstados":27}

しかし、データベースで何も見つからない場合、RestControllerはnullを返し、完全に空白の空の応答が返されます。

空の応答の代わりに空のJSONを表示するにはどうすればよいですか?うなり声のように:

{}

完全なコントローラー:

@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

まず、@RestControllerアノテーションを使用している場合、@ResponseBodyアノテーションは必要ありません。これを取り除きます。

次に、REST Controllerを使用しようとしている場合、いくつか不足していることがあるので、次のようにします。

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

上記の例でnullを取得する場合は、空の応答JSONを返します。

5
Moshe Arad

私が見つけることができた唯一の方法は、空のクラスを作成することでした

@JsonSerialize
public class EmptyJsonBody {
}

次に、これを応答に追加します

@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