Springboot @NotNull suporta Long?

4 respostas
L

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?

4 Respostas

Lucas_Camara

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?

L

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;

}
Lucas_Camara

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á.

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 !!!

Criado 8 de junho de 2021
Ultima resposta 8 de jun. de 2021
Respostas 4
Participantes 2