springboot-patterns
Faz seu agente criar sistemas backend em Java com Spring Boot. Ele organiza o código para APIs, acesso a dados e outras funções importantes.
O que ela faz
Esta skill ajuda a organizar o código de aplicativos feitos em Java com Spring Boot. Ela mostra como estruturar diferentes partes do programa, como a comunicação com o usuário (APIs REST), o processamento de dados e o armazenamento.
Quando usar
- ✓Ao criar um novo aplicativo em Java com Spring Boot.
- ✓Ao revisar ou melhorar um aplicativo Spring Boot existente.
- ✓Ao precisar organizar melhor as diferentes partes do código.
Exemplo do que pedir para a IA
“Como posso organizar meu código Spring Boot para que ele seja mais fácil de manter e escalar?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A skill demonstra padrões comuns de arquitetura, como separar o código em camadas (interface, lógica de negócios, acesso a dados). Ela também mostra como lidar com erros, cache e processamento assíncrono.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add affaan-m/ECC --skill springboot-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/springboot-patterns/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões de Desenvolvimento com Spring Boot
Arquitetura e padrões de API do Spring Boot para serviços escaláveis e prontos para produção.
Quando Ativar
- Construindo APIs REST com Spring MVC ou WebFlux
- Estruturando camadas de controller → service → repository
- Configurando Spring Data JPA, cache ou processamento assíncrono
- Adicionando validação, tratamento de exceções ou paginação
- Configurando perfis para ambientes de desenvolvimento/staging/produção
- Implementando padrões orientados a eventos com Spring Events ou Kafka
Estrutura de API REST
@RestController
@RequestMapping("/api/markets")
@Validated
class MarketController {
private final MarketService marketService;
MarketController(MarketService marketService) {
this.marketService = marketService;
}
@GetMapping
ResponseEntity<Page<MarketResponse>> list(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
Page<Market> markets = marketService.list(PageRequest.of(page, size));
return ResponseEntity.ok(markets.map(MarketResponse::from));
}
@PostMapping
ResponseEntity<MarketResponse> create(@Valid @RequestBody CreateMarketRequest request) {
Market market = marketService.create(request);
return ResponseEntity.status(HttpStatus.CREATED).body(MarketResponse.from(market));
}
}
Padrão Repository (Spring Data JPA)
public interface MarketRepository extends JpaRepository<MarketEntity, Long> {
@Query("select m from MarketEntity m where m.status = :status order by m.volume desc")
List<MarketEntity> findActive(@Param("status") MarketStatus status, Pageable pageable);
}
Camada Service com Transações
@Service
public class MarketService {
private final MarketRepository repo;
public MarketService(MarketRepository repo) {
this.repo = repo;
}
@Transactional
public Market create(CreateMarketRequest request) {
MarketEntity entity = MarketEntity.from(request);
MarketEntity saved = repo.save(entity);
return Market.from(saved);
}
}
DTOs e Validação
public record CreateMarketRequest(
@NotBlank @Size(max = 200) String name,
@NotBlank @Size(max = 2000) String description,
@NotNull @FutureOrPresent Instant endDate,
@NotEmpty List<@NotBlank String> categories) {}
public record MarketResponse(Long id, String name, MarketStatus status) {
static MarketResponse from(Market market) {
return new MarketResponse(market.id(), market.name(), market.status());
}
}
Tratamento de Exceções
@ControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
ResponseEntity<ApiError> handleValidation(MethodArgumentNotValidException ex) {
String message = ex.getBindingResult().getFieldErrors().stream()
.map(e -> e.getField() + ": " + e.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.badRequest().body(ApiError.validation(message));
}
@ExceptionHandler(AccessDeniedException.class)
ResponseEntity<ApiError> handleAccessDenied() {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ApiError.of("Forbidden"));
}
@ExceptionHandler(Exception.class)
ResponseEntity<ApiError> handleGeneric(Exception ex) {
// Log unexpected errors with stack traces
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(ApiError.of("Internal server error"));
}
}
Cache
Requer @EnableCaching em uma classe de configuração.
@Service
public class MarketCacheService {
private final MarketRepository repo;
public MarketCacheService(MarketRepository repo) {
this.repo = repo;
}
@Cacheable(value = "market", key = "#id")
public Market getById(Long id) {
return repo.findById(id)
.map(Market::from)
.orElseThrow(() -> new EntityNotFoundException("Market not found"));
}
@CacheEvict(value = "market", key = "#id")
public void evict(Long id) {}
}
Processamento Assíncrono
Requer @EnableAsync em uma classe de configuração.
@Service
public class NotificationService {
@Async
public CompletableFuture<Void> sendAsync(Notification notification) {
// send email/SMS
return CompletableFuture.completedFuture(null);
}
}
Log (SLF4J)
@Service
public class ReportService {
private static final Logger log = LoggerFactory.getLogger(ReportService.class);
public Report generate(Long marketId) {
…
Perguntas frequentes
O que é uma API REST?
É uma forma de um aplicativo se comunicar com outro pela internet, usando um conjunto padronizado de regras.
O que significa 'camadas' no código?
É como organizar o código em partes separadas, cada uma com uma função específica, para facilitar o entendimento e a manutenção.
Para que serve o 'cache'?
É uma técnica para guardar temporariamente dados que são usados com frequência, tornando o aplicativo mais rápido.
Detalhes
Descrição original do autor
Spring Boot architecture patterns, REST API design, layered services, data access, caching, async processing, and logging. Use for Java Spring Boot backend work. Use when building or reviewing a Spring Boot backend — REST layer, services, data access, caching, or async work.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #120
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
api-and-interface-design
Ajuda a criar APIs e interfaces bem definidas. É útil ao projetar como diferentes partes de um software vão se comunicar.
addyosmani/agent-skills
mason
Ajuda seu agente a escrever código limpo e funcional. Ele segue as regras definidas para garantir que tudo funcione como esperado.
sickn33/agentic-awesome-skills
max
Faz seu agente melhorar o código existente sem mudar o que ele faz. Ele deixa o código mais fácil de ler e manter.
sickn33/agentic-awesome-skills