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:

  1. Criar ProdutoController com @GetMapping, @PostMapping e retorno de ResponseEntity.

Resultado Esperado

POST /produtos -> 201 Created com header Location e body JSON.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_03_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_03_2_SeuNome
  2. 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:

  1. Injetar Pageable no controller e retornar Page<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)

  1. Salve o arquivo como: Atividade_03_3_SeuNome
  2. 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

Contexto: HATEOAS: Adição de Links Hipermídia aos DTOs no contexto de Controllers REST e DTOs com Java Records.

Requisitos de Execução:

  1. 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)

  1. Salve o arquivo como: Atividade_03_4_SeuNome
  2. 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; }
}