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

JPARepository + Javax.Validation.Constraints: ao atualizar a validation não ocorre

Olá pessoal, como estou começando não estou conseguindo ver o erro. Utilizei anotações de validação em umas propriedades de uma classe. Utilizando um JPARepository, a validação ocorre corretamente se eu tento salvar um objeto recém criado. Porém se eu faço uma alteração na propriedade da entidade retornada pelo método save e tento salvar novamente essa validação não ocorre.

//Classe / Entidade
@Entity
public class Categoria {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull @NotBlank @Length(min = 3)
    private String nome;
       //construtor, getter e setters padrao
}
//Repositorio
public interface CategoriaRepository extends JpaRepository<Categoria, Long>{
    public Page<Categoria> findByNomeIgnoreCase(String nome, Pageable paginacao);
}
//Testes
@DataJpaTest
@DisplayName("Teste do repositório de categorias")
class CategoriaRepositoryTest {

    @Autowired
    private CategoriaRepository categoriaRepository;

       //Ok
    @Test
    void deveGerarUmExcecaoAoSalvarUmaCategoriaSemNome() {
        Categoria nova = new Categoria("");

        assertThatThrownBy(() -> categoriaRepository.save(nova)).isInstanceOf(ConstraintViolationException.class);
    }
       //Ok
    @Test
    void deveGerarUmExcecaoAoSalvarUmaCategoriaOndeAlterouONomeParaNull() {
        Categoria nova = new Categoria("teste");
        nova.setNome(null);

        assertThatThrownBy(() -> categoriaRepository.save(nova)).isInstanceOf(ConstraintViolationException.class);
    }
       //Dá errado, pois a validação não ocorre na atualização e salva com o nome sendo null
    @Test
    void deveGerarUmaExcecaoAoAtualizarUmaCategoriaSemNome() {
        Categoria nova = new Categoria("Teste");

        Categoria salva = categoriaRepository.save(nova);
        salva.setNome(null);

        assertThatThrownBy(() -> categoriaRepository.save(salva)).isInstanceOf(ConstraintViolationException.class);
    }
}

Qual conceito que não entendi ou onde estou vacilando?

Obrigado!

2 respostas

Oi Leonardo,

O código está certinho mesmo.

Acredito que deve ser algum problema relacionado com a transação no update.

Altera o codigo para:

assertThatThrownBy(() -> categoriaRepository.saveAndFlush(salva)).isInstanceOf(ConstraintViolationException.class);

E veja se assim funciona a validação.

solução!

Oi Rodrigo, obrigado pela dica. Tive que trocar o metodo save para saveAndFlush nas duas chamadas, ai funcionou.

    @Test
    void deveGerarUmaExcecaoAoAtualizarUmaCategoriaSemNome() {
        Categoria nova = new Categoria("Teste");

        Categoria salva = categoriaRepository.saveAndFlush(nova);
        salva.setNome(null);

        assertThatThrownBy(() -> categoriaRepository.saveAndFlush(salva)).isInstanceOf(ConstraintViolationException.class);
    }

Novamente, muito obrigado!