Bom dia, estou criando um API Rest com springboot e estou validando essa API, o problema é o seguinte estou utilizando a tag @NotNull do import javax.validation.constraints.NotNull; essa tag irá em cima de um variavel cpf, estou utilizando tambem a anotação @CPF, ela é minha primary key, porém quando vou fazer a inserção via JSON me deparo com o seguinte erro:
[No validator could be found for constraint ‘javax.validation.constraints.NotNull’ validating type ‘java.lang.Long’].
Fiz alguns testes e caso eu troque a variavel de tipo Long por Integer ele funciona perfeitamente, o problema é que no caso um CPF quebra o limite de um Integer, eu preciso de um Long, o @NotNull não suporta tipo Long?
Antes de qualquer coisa, vc não deveria usar o tipo Long para um CPF, afinal, CPF não é exatamente um número (onde vc precisa fazer cálculos). Recomendo que vc utilize String
para isso.
Sobre o @NotNull
, não deveria ter problemas ao utilizar com o tipo Long
. Tem como vc mostrar o código da sua API e da classe onde o @NotNull
está sendo usado?
Ah sim, pensei em utilizar String, na real pretendo até mudar, mas encuquei o motivo dele não aceitar o Long, infelizmente não achei resposta para isso na internet, caçei em todo canto, inglês e português. De qualquer maneira segue a classe:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.br.CPF;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Cliente {
@Id
@NotNull(message = "{campo.cpf.obrigatorio}")
@CPF(message = "{campo.cpf.invalido}")
private Long cpf_cliente;
@Column(nullable = false, length = 150)
@NotEmpty(message = "{campo.nome.obrigatorio}")
private String nome;
@Column(nullable= false, length = 150)
private String telefone;
@Column(nullable= false, length = 150)
private String email;
@Column(nullable = false)
private String uf;
}
Usar o @NotNull no escopo de banco (JPA/Hibernate) soh vai funcionar junto com o hibernate-validation (que implementa a especificação do beans validation).
Veja:
Talvez vc esteja confundindo com o uso das validações no escopo do Spring, que é quando vc cria um método para servir algum endpoint REST, onde é preciso validar os parâmetros de entrada. Apesar de ser a mesma especificação, eles são ativados por implementações diferentes (bom, pelo menos é o que eu acho, alguém me corrija se estiver errado).
No Spring, basta adicionar um @Valid
que a validação irá acontecer. No caso de uma entidade, dê uma lida no link que passei que tem uma explicação lá.
Então, mas tipo eu tenho uma classe de validação que caso seja nulo ele deve retornar a mensagem da variavel indentada {}, veja:
import org.springframework.context.annotation.Configuration;
import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class InternacionalizacaoConfig {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("ISO-8859-1");
messageSource.setDefaultLocale(Locale.getDefault());
return messageSource;
}
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
}
Tem outra classe que trata essas mensagens também.
Sobre a tag @Valid, eu uso ela no meu controller, no post e put:
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Cliente salvar(@RequestBody @Valid Cliente cliente) {
return repository.save(cliente);
}
Tanto que quand faço teste com um Integer, e tento passar um valor vázio, ele me retorna a mensagem de erro que quero validar, por exemplo: campo cpf é obrigatorio e quando coloca um CPF que não bate, ele me retorna um CPF Inválido, agora quando muda o Integer para Long ai a historia muda, no momento que mando a requisição para inserir ele da o erro do Long. Creio que esse @NotNull não suporta Long, nunca explicação, senão o Integer nem funcionaria. De qualquer maneira vou dar uma lida no material que você passou e adotar o String mesmo kkkkkkk Deixo meus agradecimentos !!!