Cria, revisa e refatora endpoints REST Sankhya com `@Controller` — `serviceName`, SP, `@Transactional`, DTOs, `@Valid`, mapeamento HTTP (GET/POST/PUT/DELETE), códigos de status. Use ao criar, alterar, revisar, auditar ou padronizar controllers REST, ao expor cadastro/feature via REST, ao integrar com app mobile/frontend, ao implementar listagem/lançamento/detalhamento/atualização/exclusão, ao receber spec de endpoint/API, ao trabalhar com arquivos `*Controller.java`, ou ao tocar em código com `@Controller`/`@GetMapping`/`@PostMapping`/`@RequestMapping`.
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Cria, revisa e refatora endpoints REST Sankhya com `@Controller` — `serviceName`, SP, `@Transactional`, DTOs, `@Valid`, mapeamento HTTP (GET/POST/PUT/DELETE), códigos de status. Use ao criar, alterar, revisar, auditar ou padronizar controllers REST, ao expor cadastro/feature via REST, ao integrar com app mobile/frontend, ao implementar listagem/lançamento/detalhamento/atualização/exclusão, ao receber spec de endpoint/API, ao trabalhar com arquivos `*Controller.java`, ou ao tocar em código com `@Controller`/`@GetMapping`/`@PostMapping`/`@RequestMapping`.
@Controller marca classes = pontos entrada API interna add-on. Cada metodo publico auto-exposto como endpoint servico. Controllers orquestram fluxo requisicao — nunca contem logica negocio.
Nome servico registrado plataforma. Deve terminar com sufixo SP.
@Controller(serviceName = "PedidoControllerSP")
serviceName define URL acesso servico. Cada metodo publico exposto como <serviceName>.<nomeDoMetodo>.
transactionType (opcional)
Define comportamento transacional padrao todos metodos classe.
EJBTransactionType
Descricao
Quando usar
Supports
Usa transacao se ja existir; senao, sem.
Padrao. Controllers mistura leitura+escrita.
Required
Sempre executa em transacao (cria se nao existir).
Controllers 100% escrita.
NotSupported
Executa fora transacao (suspende se existir).
Controllers 100% leitura.
// Padrao (leitura + escrita com @Transactional granular)@Controller(serviceName = "MeuControllerSP", transactionType = EJBTransactionType.Supports)// Somente escrita@Controller(serviceName = "MeuControllerSP", transactionType = EJBTransactionType.Required)// Somente leitura@Controller(serviceName = "ConsultaControllerSP", transactionType = EJBTransactionType.NotSupported)
3. Controle Transacional com @Transactional
Anotacao @Transactional em metodo sempre tem precedencia sobre transactionType da classe.
@Controller(serviceName = "MeuControllerSP", transactionType = EJBTransactionType.NotSupported)publicclassMeuController {
// Usa o padrao da classe (NotSupported) — sem transacaopublic List<MeuDTO> listar() { ... }
// Sobrepoe o padrao — executa em transacao propria@Transactionalpublic MeuDTO criar(@Valid MeuRequest request) { ... }
// Sobrepoe com transacao nova (isolada)@Transactional(Transactional.TxType.REQUIRES_NEW)publicvoidprocessarBatch() { ... }
}
Quando usar @Transactional
Operacao
@Transactional
Motivo
Create / Update / Delete
Sim
Garante atomicidade
Leitura simples
Nao
Sem necessidade transacao
Leitura + escrita mesmo metodo
Sim
Garante consistencia
Operacao idempotente (sem side effects)
Nao
Desnecessario
4. DTOs (Request / Response)
Controllers nunca expoe entidades dominio diretamente. Use DTOs = contratos entrada/saida.
Organizacao
Skill nao opina sobre pacotes. Padrao comum: DTOs (Request/Response) e mapper MapStruct ficam junto do controller (mesmo pacote ou subpacotes dto/ e mapper/ ao lado do *Controller.java). Ajuste a sua arquitetura.
Request DTO
Usa @Data (Lombok) + validacao javax.validation:
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.DecimalMin;
import java.math.BigDecimal;
@DatapublicclassCriarPedidoRequest {
@NotNull(message = "O codigo do parceiro e obrigatorio.")private BigDecimal codParceiro;
@NotBlank(message = "A descricao e obrigatoria.")private String descricao;
@DecimalMin(value = "0.01", message = "O valor deve ser maior que zero.")private BigDecimal valor;
private String observacao; // Opcional — sem validacao
}
Ambientes com Gateway Sankhya: auth via MobileLogin nao necessaria — Gateway gerencia token.
Formato da Request (POST)
{"serviceName":"PedidoControllerSP.criarPedido","requestBody":{"request":{"codParceiro":12345,"descricao":"Pedido de teste","valor":150.50,"observacao":"Entrega urgente"}}}
Regras:
serviceName: <serviceName>.<nomeMetodo> (mesmo valor URL).
requestBody: Contem argumentos metodo como propriedades nomeadas pelo nome parametro Java.
Metodo criarPedido(CriarPedidoRequest request) = JSON usa "request" como chave. Se fosse criarPedido(CriarPedidoRequest pedido), chave seria "pedido".
{"serviceName":"PedidoControllerSP.criarPedido","status":"0","pendingPrinting":"false","transactionId":"CB0F625A72C214CF8449F0B18E1FA81A","statusMessage":"Erro de validacao: O campo descricao e obrigatorio"}
status
Significado
"1"
Sucesso
"0"
Erro de execucao
"3"
Timeout
"4"
Cancelado por concorrencia
Erro: responseBody nao incluido. Mensagem fica em statusMessage.
6. Tipo de Retorno dos Metodos
Tipo retorno cada metodo definido pela regra negocio projeto:
Metodos retornam dados = retornam DTO resposta diretamente.
Metodos sem retorno dados = void.
// Com retorno de dadospublic PedidoResponse criarPedido(@Valid CriarPedidoRequest request) {
...
return mapper.toResponse(resultado);
}
// Sem retorno de dados@Transactionalpublicvoidcancelar(@Valid CancelarPedidoRequest request) {
cancelarPedidoService.execute(request.getNuPedido());
}
Framework serializa automaticamente o objeto retornado em responseBody da response.
7. Tratamento Global de Excecoes (@ControllerAdvice)
Excecoes lancadas em metodos do controller devem ser tratadas em classe @ControllerAdvice separada. Nunca capturar excecao no proprio controller — deixar propagar.
Ver controller-advice para regras criticas (handler nao pode retornar void, multiplas excecoes por handler, rollback automatico, proibicao de Exception.class) e niveis de log sugeridos.
8. Fluxo Padrao de um Metodo
Request DTO —@Valid—> Controller —mapper—> Domain Object
|
|— Service.execute(domain)
| |— (logica na sua camada de servico)
|
|— mapper.toResponse(resultado)
|
|— return response