Tratamento de Erros
O Archbase fornece um sistema centralizado de tratamento de erros com exceções e respostas padronizadas.
Exceções do Framework
| Exceção | HTTP Status | Quando Usar |
|---|---|---|
ResourceNotFoundException | 404 | Recurso não encontrado |
ValidationException | 400 | Erro de validação |
BusinessRuleException | 422 | Violação de regra de negócio |
ConflictException | 409 | Conflito de dados |
UnauthorizedException | 401 | Não autenticado |
ForbiddenException | 403 | Sem permissão |
ArchbaseException | 500 | Erro genérico |
Exceções de Domínio
ResourceNotFoundException
@Service
public class ClienteService {
private final ClienteRepository repository;
public Cliente buscarPorId(UUID id) {
return repository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException(
"Cliente não encontrado",
id
));
}
}
Resposta:
{
"timestamp": "2024-12-28T10:30:00Z",
"status": 404,
"error": "Not Found",
"message": "Cliente não encontrado",
"path": "/api/v1/clientes/123",
"resourceId": "123"
}
ValidationException
@Service
public class PedidoService {
public void criar(Pedido pedido) {
ValidationResult result = pedido.validate();
if (!result.isValid()) {
throw new ValidationException(
"Erro de validação do pedido",
result.getErrors()
);
}
repository.save(pedido);
}
}
Resposta:
{
"timestamp": "2024-12-28T10:30:00Z",
"status": 400,
"error": "Bad Request",
"message": "Erro de validação do pedido",
"errors": [
{
"field": "clienteId",
"message": "Cliente é obrigatório"
},
{
"field": "itens",
"message": "Pedido deve ter ao menos um item"
}
]
}
BusinessRuleException
@Service
public class CaixaService {
public void fecharCaixa(UUID caixaId, UUID operadorId) {
Caixa caixa = caixaRepository.findById(caixaId)
.orElseThrow(() -> new ResourceNotFoundException("Caixa", caixaId));
if (!caixa.podeSerFechado()) {
throw new BusinessRuleException(
"Caixa não pode ser fechado",
"CAIXA_ABERTO",
Map.of("status", caixa.getStatus(), "saldo", caixa.getSaldo())
);
}
caixa.fechar(operadorId);
caixaRepository.save(caixa);
}
}
Resposta:
{
"timestamp": "2024-12-28T10:30:00Z",
"status": 422,
"error": "Unprocessable Entity",
"message": "Caixa não pode ser fechado",
"code": "CAIXA_ABERTO",
"details": {
"status": "ABERTO",
"saldo": 150.00
}
}
ConflictException
@Service
public class UsuarioService {
public Usuario criar(Usuario usuario) {
if (repository.existsByEmail(usuario.getEmail())) {
throw new ConflictException(
"Já existe um usuário com este e-mail",
"EMAIL_DUPLICADO",
"email"
);
}
return repository.save(usuario);
}
}