Inicialização Spring consumindo e produzindo JSON

Inicialização Spring consumindo e produzindo JSON

1. Visão geral

Neste tutorial, mostraremoshow to build a REST service to consume and produce JSON content with Spring Boot.

Também daremos uma olhada em como podemos empregar facilmente a semântica HTTP RESTful.

Para simplificar, não vamosinclude a persistence layer, masSpring Data torna isso simples de adicionar também.

2. Serviço REST

Escrever um serviço JSON REST no Spring Boot é simples, já que essa é a opinião padrão quandoJackson está no classpath:

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService service;

    @GetMapping("/{id}")
    public Student read(@PathVariable String id) {
        return service.find(id);
    }

...

Anotando nossoStudentController with@RestController,we’ve told Spring Boot to write the return type of the read method para o corpo de resposta. Since we also have a @RequestMapping at the class level, seria o mesmo para quaisquer outros métodos públicos que adicionarmos.

Embora simples,this approach lacks HTTP semantics. Por exemplo, o que deve acontecer se não encontrarmos o aluno solicitado? Em vez de retornar um código de status 200 ou 500, convém retornar um 404.

Vamos dar uma olhada em como obter mais controle sobre a própria resposta HTTP e, por sua vez, adicionar alguns comportamentos RESTful típicos ao nosso controlador.

3. Crio

Quando precisamos controlar outros aspectos da resposta além do corpo - como o código de status - podemos retornar umResponseEntity:

@PostMapping("/")
public ResponseEntity create(@RequestBody Student student) throws URISyntaxException {
    Student createdStudent = service.create(student);
    if (createdStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
          .path("/{id}")
          .buildAndExpand(createdStudent.getId())
          .toUri();

        return ResponseEntity.created(uri)
          .body(createdStudent);
    }
}

Aqui, estamos fazendo muito mais do que apenas retornar oStudent criado na resposta. Additionally, we respond with a semantically clear HTTP status and, if creation succeeded, a URI to the new resource.

4. Read

Como mencionado antes, se quisermos ler um únicoStudent, é mais claro semanticamente retornar um 404 se não conseguirmos encontrar o aluno:

@GetMapping("/{id}")
public ResponseEntity read(@PathVariable("id") Long id) {
    Student foundStudent = service.read(id);
    if (foundStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(foundStudent);
    }
}

Aqui, podemos ver claramente a diferença de nossa implementação inicial deread().

Desta forma, o objetoStudent será devidamente mapeado para o corpo da resposta e retornado com um status adequado ao mesmo tempo.

5. Atualizar

A atualização é muito semelhante à criação, exceto que é mapeada para PUT em vez de POST, e URI contém umid do recurso que estamos atualizando:

@PutMapping("/{id}")
public ResponseEntity update(@RequestBody Student student, @PathVariable Long id) {
    Student updatedStudent = service.update(id, student);
    if (updatedStudent == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(updatedStudent);
    }
}

6. Excluir

A operação de exclusão é mapeada para o método DELETE. URI também contém oid do recurso:

@DeleteMapping("/{id}")
public ResponseEntity deleteStudent(@PathVariable Long id) {
    service.delete(id);
    return ResponseEntity.noContent().build();
}


Não fizemosimplement specific error handling, porque o métododelete() na verdade falha ao lançar umException.

7. Conclusão

Neste artigo, vimos como consumir e produzir conteúdo JSON em um serviço CRUD REST típico desenvolvido com uma Spring Boot. Além disso, demonstramos como implementar o controle adequado do status da resposta e o tratamento de erros.

Para manter as coisas simples, não partimos para a persistência desta vez, masSpring Data REST fornece uma maneira rápida e eficiente de construir um serviço de dados RESTful.

O código-fonte completo para o exemplo éavailable over on GitHub.