1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Validação Vraptor

Olá a todos do GUJ, boa tarde.

Estou seguindo o livro de Vraptor da CDC e estou na parte de validações. A validação que criei foi para não permitir que um dado livro seja cadastrado com o ISBN igual ao de um já existente no banco de dados. A mesma funciona perfeitamente quando vou inserir um novo livro.

Minha @annotation

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {IsbnAvailableValidator.class})
@Documented
public @interface IsbnAvailable {
   String message() default "{livro.isbn.existe}";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

Minha classe IsbnAvailableValidator

public class IsbnAvailableValidator implements ConstraintValidator<IsbnAvailable, Livro> {

   @Inject
   private JPALivroDAO dao;

   @Override
   public void initialize(IsbnAvailable arg0) {
      // TODO Auto-generated method stub

   }

   @Override
   public boolean isValid(Livro livro, ConstraintValidatorContext context) {
      return dao.containsLivroWithIsbn(livro.getIsbn());
   }

}

Meu método definido na classe LivroController para inserir e atualizar um livro no banco de dados:

@IncludeParameters
 @Post
 public void salva(@Valid @IsbnAvailable Livro livro) {
    validator.onErrorRedirectTo(this).formulario();

    estante.guarda(livro);

    result.include("livroSalvo", "Livro salvo com sucesso.");
    result.redirectTo(this).lista();
 }

Meu método definido na classe JPALivroDAO para persistir objetos no banco de dados.

@Override
 public void adiciona(Livro livro) {
    manager.getTransaction().begin();

    if (livro.getId() == null) {
       manager.persist(livro);
    } else {
       manager.merge(livro);
    }

    manager.getTransaction().commit();
 }

Como disse acima, quando vou inserir um novo livro funciona perfeitamente, no entanto, quando vou alterar um livro o mesmo diz que já tem um livro com o ISBN cadastrado (o que faz total sentido), mas o que eu queria era que ao fazer uma alteração esse detalhe não fosse levado em consideração caso eu não altere o valor do campo ISBN.

Alguém sabe me dizer o que devo alterar em meu código para que o comportamento descrito acima funcione?

De já obrigado pela ajuda de todos.

Obs.: utilizo um único formulário para cadastrar e alterar um livro.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags vraptor java banco-de-dados ou faça a sua própria pergunta.