Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Enum Spring boot - Validacoes / Tipo de Dados

Boa Noite! Nao consegui encontrar algo relacionado ao ENUM. 1- Existe alguma Anotação que valida o mesmo?

2- Existe uma outra forma de trabalhar com itens fixo?

3- Como listar no Swagger as opções permitidas? Ou apenas no retorno do erro os campos permitidos?

Exemplo (Pessoa Física / Jurídica) Status (Aberto / Pendente / Fechado)

No curso ja vem pre-definido.

Senti falta de 3 topicos.:

  • Tratar erros de negocio dentro da API. (retorno de mensagens mais amigáveis)
  • Trabalhar na API com relacionamento e sua validações de integridade antes do erro
  • Enum
2 respostas
solução!

Oi Guilherme,

Se não me engano, quando você tem um parâmetro que é um ENUM e o cliente envia algum valor que não é válido, o Spring lança uma exception.

Para documentar no swagger os valores possíveis de um parametro do tipo ENUM, você vai precisar utilizar as anotações do swagger para personalizar o endpoint na documentação:

@ApiImplicitParams({@ApiImplicitParam(name = "statusPedido", dataType = "br.com.alura.forum.modelo.StatusPedido", paramType = "query", value = "Status do pedido", allowableValues="ABERTO, PENDENTE, FECHADO")
})
public ResponseEntity<?> metodo(@ApiIgnore StatusPedido statusPedido) {
    //...
}

Para validações de regra de negócio você pode escrever o código delas em uma classe service, que será chamada do controller. E quando tiver um erro de RN, você pode lançar uma exception da classe service e criar um ControllerAdvice para tratar o erro e adicionar uma mensagem mais amigavel para retornar ao cliente.

Bons estudos!

Perfeito.

Para o ENum, como não encontrei nada até sua resposta eu resolvi com uma entidade. Cadastro via SQL e deixei o usuário consultar

Etapa.java

@Entity
@Getter @Setter
@Data
public class Etapa {
    @Id @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @Column(unique=true)
    private String descricao;

    public  Etapa(){
    }

    public Etapa(String descricao){
        this.descricao = descricao;
    }
}

Para o Erro utilizei a seguinte abordagem

ErroDeValidacaoHandler.java

   @ResponseStatus(code= HttpStatus.NOT_FOUND)
    @ExceptionHandler(ErroConteudoNaoEncontrado.class)
    public ErroDeFormularioDto handle(ErroConteudoNaoEncontrado exception){
        return new ErroDeFormularioDto(exception.getCampo(), exception.getErro());
    }

ErroConteudoNaoEncontrado.java

@Getter
public class ErroConteudoNaoEncontrado extends ErroGenerico{
    public ErroConteudoNaoEncontrado(String campo, String erro) {
        super(campo, erro);
    }
}

EtapaService.java

   private Etapa buscarEtapa(Long id) {
        Optional<Etapa> etapa = etapaRepository.findById(id);
        if (etapa.isPresent()) {
            return etapa.get();
        }
        throw new ErroConteudoNaoEncontrado("id", "Etapa nao encontrada");
    }

Assim que terminar o desafio posto o link aqui.