3
respostas

[Dúvida] Aviso de estabilidade do Json não garantida

Fiz tudo certinho com o instrutor e quando faço o request da api ela está retornando como o esperado. Porém, no meu console está aparecendo uma mensagem de aviso quanto a estabilidade da estrutura do json, que só passou a aparecer após implementar a paginação.

Devo me preocupar?

2024-07-12T08:18:42.241-03:00  WARN 2176 --- [api] [nio-8080-exec-1] PageModule$PlainPageSerializationWarning : Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure!
    For a stable JSON structure, please use Spring Data's PagedModel (globally via @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO))
3 respostas

Oi!

Manda aqui como ficou o método no seu controller

@RequestMapping("/medicos")
@SecurityRequirement(name = "bearer-key")
public class MedicoController {

    @Autowired
    private MedicoRepository repository;

    @PostMapping
    @Transactional // tem que ser a anotação que vem do pacote do spring
    public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroMedico dados,
                                    UriComponentsBuilder uriBuilder) {

        var medico = new Medico(dados);
        repository.save(medico);
        var uri = uriBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri();

        return ResponseEntity.created(uri).body(new DadosDetalhamentoMedico(medico));
    }

    @GetMapping                 //Pageable tem que ser uma classe do pacote Spring e nao awt
    public ResponseEntity<Page<DadosListagemMedico>> listarMedicos(
            @PageableDefault(size = 10, sort = {"nome"})
            Pageable paginacao) {

        var page = repository.findAllByAtivoTrue(paginacao)
                .map(DadosListagemMedico::new);

         return ResponseEntity.ok(page);
    }

    @PutMapping
    @Transactional
    public ResponseEntity atualizar (@RequestBody @Valid DadosAtualizarMedico dados) {
        var medico = repository.getReferenceById(dados.id());
        medico.atualizarInformacoes(dados);

        return ResponseEntity.ok(new DadosDetalhamentoMedico(medico));
    }

    @DeleteMapping("/{id}")
    @Transactional
    public ResponseEntity excluir (@PathVariable Long id) {
        var medico = repository.getReferenceById(id);
        medico.excluir();

        return ResponseEntity.noContent().build();
    }

    @GetMapping("/{id}")
    public ResponseEntity detalhar (@PathVariable Long id) {
        var medico = repository.getReferenceById(id);
        return ResponseEntity.ok(new DadosDetalhamentoMedico(medico));
    }
}

Esse warning começou nas últimas versões do Spring Boot e ele é por conta de retornar o objeto Page nos controller. Para resolver, basta adicioanr essa anotação na classe main do projeto (ApiAplication):

@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)