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`.
설치
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
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