Melhor maneira de criar uma validacao

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

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

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

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/

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

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:

[code]// 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)
[/code]

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!

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)

[code]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>

}[/code]

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

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

:?:

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

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