Melhor maneira de criar uma validacao

10 respostas
G

Oi pessoal, tenho uma Classe na minha BusinessObjects Customer e CustomerContainer e na minha DatabaseObjects tenho a Classe CustomerDAO, além dessas camadas tenho a camada de GUI (com GuiCustomer) e a camada Model (com CustomerModel)…agora é o seguinte, queria fazer um esquema de validacao dinamico, sem que eu precisasse ficar verificando na minha GUI se o valor foi digitado corretamente ou nao. Pelo que sei o mais correto, é a validacao do Objeto, ou seja: se tenho a propriedade Name e DateOfBirth na minha Classe Customer, como validaria isso de forma dinamica?

Tipo fazer algo como:

if(oCustomer.getName().IsValid()) oCustomer.setName(…
if(oCustomer.getDateOfBirth().IsValid()) oCustomer.setDateOfBirth(…

No caso se nao for valid criar uma lista com os erros gerados numa Collection e se o tamanho dessa Collection entao for > 0 entao mostrar essa lista de erros.

Tem alguma Pattern de validacao que seja interessante eu dar uma olhada?

Obrigado

10 Respostas

G

O Hibernate Validator faz isso. Basta você anotar as propriedades do seu bean com, por exemplo, @NotNull, @NotEmpty, etc…

Mesmo sendo um filho do projeto Hibernate ele funciona standalone, ou seja, funciona em uma aplicação swing mesmo que você não use Hibernate.

http://www.hibernate.org/subprojects/validator.html

G

muito obrigado garcia, vou dar uma estudada a respeito. infelizmente ainda nao tive experiencia com hibernate, mas qualquer dúvida posto aqui de volta!

abracos

G

Mesmo o nome tendo Hibernate no meio, não tem nada a ver com o Hibernate. A JSR303 com o nome Bean Validation permite que você use esse tipo de coisa, e o Hibernate Validator implementa a JSR303.

http://jcp.org/en/jsr/detail?id=303


Esse aqui tem a melhor documentação sobre o assunto
http://people.redhat.com/~ebernard/validation/

G

ja estou lendo a documentacao, mas dei uma olhada rapidao por cima…é só pra web? estou trabalhando com swing e sou leigo em java ainda!

muito obrigado

G

groh, como eu falei lá no meu primeiro post, o Hibernate Validator funciona para qualquer coisa, seja ambiente web como desktop. E mesmo o nome dele sendo Hibernate Validator ele roda sozinho, sem precisar do Hibernate.

O Hibernate Validator implementa a JSR303 (te passei o link logo acima). Essa JSR303 especficia uma forma de validar um bean a partir de anotações. Um exemplo é algo como querer validar um cliente e dizer que, por exemplo, o nome não pode ser nulo.

public class Customer {
    @NotNull
    private String name;
}

Para chamar a validação você precisa iniciar a factory do validator:

// inicia a factory
ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory();

// aqui você valida seu objeto, e retorna uma lista com os erros de validação
final Set<ConstraintViolation<?>> violations = validator.validate(bean)
G

garcia mto obrigado pela atencao…estou até agora tentando usar esse validator no meu projeto, pelo que andei lendo é mesmo muito mao na roda! baixei o Hibernate Validator 4.0 Beta 1, mas quando adiciono o .jar na minha Library e chamo por import:

import org.hibernate.validator;

recebo um aviso de erro que em [color=red]org[/color] onde diz que essa biblioteca nao existe, ou algo assim!

estou tentando aprender também o que é classpath, pra ver se consigo registrar o .jar la, mas por enquanto sem chances! rs…

uma hora sai…

baixei um tutorial que explica, mas com a versao do Validator 3.0, vamos ver o que vai dar!!!

muito obrigado novamente!

G

garcia, tudo bem?

olha, consegui de alguma forma acoplar o validator ao meu projeto. o problema é que nao sabia que tinha que adicionar a pasta /lib na minha Library. Pensei que somente o .jar resolvesse, mas tudo bem! Agora funciona, porém nao consigo chamar o Abstract Factory. Aqui esta minha classe cliente:

(nao esquente com a nomenclatura, esta em alemao e Kunde significa cliente)

public class Kunde {

    private int kundenID;

    private String name;
    private String adresse;
    private int hausNummer;
    private String email;

    private KundenDAO myDAO;

    //<editor-fold defaultstate="collapsed" desc="Initialize">
    void Initialize()
    {
        this.kundenID = -1;
        this.name = null;
        this.adresse = null;
        this.hausNummer = -1;
        this.email = null;
        this.myDAO = KundenDAO.getInstance();
    }
    //</editor-fold>

    public Kunde(){ Initialize(); }

    public Kunde(int kundenID, String name, String adresse, int hausNummer, String email) {
        this.kundenID = kundenID;
        this.name = name;
        this.adresse = adresse;
        this.hausNummer = hausNummer;
        this.email = email;

        this.myDAO = KundenDAO.getInstance();
        this.myDAO.save(this);
    }

    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    @NotNull
    public String getAdresse() {
        return adresse;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    @NotNull
    @Email
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @NotNull
    public int getHausNummer() {
        return hausNummer;
    }

    public void setHausNummer(int hausNummer) {
        this.hausNummer = hausNummer;
    }

    @NotNull
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    // </editor-fold>

}

Agora tentei recuperar na minha GUI a exception, mas nada, entao tentei fazer como vc disse

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

porém o NetBeans fica pedindo para eucriar a classe ValidatorFactory e nao me da a opcao de importar a package!

O que esta errado?

Obrigado e abracos

G

Bom, consegui achar as referencias pro ValidatorFactory e etc…que sao as seguintes, correto?

import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory;

Mas um erro esta ocorrendo na seguinte linha:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

O erro:

Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation

:?:

G

Agora que eu ví tuas mensagens, sorry :smiley:

Acho que esse último erro quer dizer que você não possui o jar que contém a classe javax.validation.Validation. Você vai precisar adicionar também o jar validation-api-1.0.0.GA.jar que vem junto com o hibernate-validator.

Não use a documentação do Hibernate Validator 3 para o Hibernate Validator 4, pois são completamente diferentes. Nos links que eu te passei logo lá encima tem a documentação do 4.

Quanto ao resto dos teus códigos, está tudo certo, você aprendeu mesmo como fazer. Basta agora você importar aquele jar e tudo vai funcionar.

Abraços

G

caracas, as vezes dou gracas a deus em programar c#…rs

valeu garcia, depois posto a solucao aqui, acho que esse tópico pode ser útil pra outras pessoas depois, abracos

Criado 10 de maio de 2010
Ultima resposta 12 de mai. de 2010
Respostas 10
Participantes 2