🧩 Exercícios: Controllers REST e DTOs com Java Records
Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 03.1 — Controller REST com @RestController e Mapeamentos HTTP
Contexto: Controller REST com @RestController e Mapeamentos HTTP no contexto de Controllers REST e DTOs com Java Records.
Requisitos de Execução:
- Criar
ProdutoControllercom@GetMapping,@PostMappinge retorno deResponseEntity.
Resultado Esperado
POST /produtos -> 201 Created com header Location e body JSON.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_1_SeuNome - Envie na tarefa:
Atividade Cap 03 - Controllers REST e DTOs com Java Records
🔑 Gabarito de Código & Solução Comentada
// ProdutoController.java
package com.empresa.api.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
@RestController
@RequestMapping("/api/v1/produtos")
public class ProdutoController {
@PostMapping
public ResponseEntity<ProdutoResponseDTO> criar(@RequestBody ProdutoCreateDTO dto) {
ProdutoResponseDTO criado = new ProdutoResponseDTO(1L, dto.nome(), dto.preco());
return ResponseEntity.created(URI.create("/api/v1/produtos/1")).body(criado);
}
}
🔍 Nível 2: Prática
Problema 03.2 — Uso de Java Records como DTOs Imutáveis
Contexto: Uso de Java Records como DTOs Imutáveis no contexto de Controllers REST e DTOs com Java Records.
Requisitos de Execução:
- Modelar DTOs de entrada e saída com Java 21 Records e anotações Jackson.
Resultado Esperado
DTOs imutáveis com serialização automática para JSON.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_2_SeuNome - Envie na tarefa:
Atividade Cap 03 - Controllers REST e DTOs com Java Records
🔑 Gabarito de Código & Solução Comentada
// DTOs.java
package com.empresa.api.controller;
import java.math.BigDecimal;
record ProdutoCreateDTO(String nome, BigDecimal preco, String categoria) {}
record ProdutoResponseDTO(Long id, String nome, BigDecimal preco) {}
const statusConcluido = true;
console.log('Validação de execução concluída');
⚡ Nível 3: Integração
Problema 03.3 — Paginação e Ordenação com Spring Data Pageable
Contexto: Paginação e Ordenação com Spring Data Pageable no contexto de Controllers REST e DTOs com Java Records.
Requisitos de Execução:
- Injetar
Pageableno controller e retornarPage<ProdutoResponseDTO>com metadados de paginação.
Resultado Esperado
GET /api/v1/produtos?page=0&size=10&sort=preco,desc -> 200 OK com array e metadados.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_3_SeuNome - Envie na tarefa:
Atividade Cap 03 - Controllers REST e DTOs com Java Records
🔑 Gabarito de Código & Solução Comentada
// PaginatedController.java
package com.empresa.api.controller;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/v1/itens")
public class ItemController {
@GetMapping
public Page<String> listar(Pageable pageable) {
return new PageImpl<>(List.of("Item A", "Item B"), pageable, 2);
}
}
🏆 Nível 4: Desafio Corporativo
Problema 03.4 — HATEOAS: Adição de Links Hipermídia aos DTOs
Contexto: HATEOAS: Adição de Links Hipermídia aos DTOs no contexto de Controllers REST e DTOs com Java Records.
Requisitos de Execução:
- Implementar Spring HATEOAS adicionando links de auto-relacionamento (
_links.self) nos recursos retornados.
Resultado Esperado
JSON HATEOAS com links 'self', 'atualizar' e 'cancelar'.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_4_SeuNome - Envie na tarefa:
Atividade Cap 03 - Controllers REST e DTOs com Java Records
🔑 Gabarito de Código & Solução Comentada
// HateoasModel.java
package com.empresa.api.controller;
import org.springframework.hateoas.RepresentationModel;
public class PedidoModel extends RepresentationModel<PedidoModel> {
private Long id;
private String status;
public PedidoModel(Long id, String status) {
this.id = id;
this.status = status;
}
public Long getId() { return id; }
public String getStatus() { return status; }
}