galera criei uma classe conforme a apostila do caleum fj-28, com o método:
public void adiciona(final Produto produto){
if(produto.getNome()==null||produto.getNome().length()<3){
validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras","produto.nome"));
}
if(produto.getDescricao()==null||produto.getDescricao().length()>40){
validator.add(new ValidationMessage("Descrição é obrigatória não pode ter mais de 40 letras","produto.descricao"));
}
if(produto.getPreco()<=0){
validator.add(new ValidationMessage("Preço precisa ser positivo","produto.preco"));
}
validator.onErrorUse(page()).of(ProdutosController.class).formulario();
dao.salva(produto);
result.redirectTo(ProdutosController.class).lista();
}
caso a pessoa não digitasse nada(ou algum valor incorreto) era para aparecer uma mensagem de erro, coisa que não esta fazendo,aparece o erro:
Caused by: java.lang.NullPointerException
at br.com.caelum.goodbuy.controller.ProdutosController.adiciona(ProdutosController.java:37)
obs; eu acho que o erro esta vindo do método adiciona,não tenho certeza
Você verifica se é igual a null e depois tenta verificar o tamanho.
Se for null vai NullPointerException.
(Não testei, logo não posso afirmar que seja isso)
Se o seu atributo nome for null você não pode verficar o tamanho, porque ele não existe.
Acho que primeiro você deveria verificar se é diferente de null. Se for diferente de null dai sim você verifica o tamanho.
então tentei fazer isso que vc disse, mas continua dando erro:
br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException
.
.
.
java.lang.NullPointerException
br.com.caelum.goodbuy.controller.ProdutosController.adiciona(ProdutosController.java:37)
ProdutosController.java:37 seria essa linha no meu código:
quando vc não passa nenhuma informação do produto na requisição (não preencheu o formulário, por exemplo), o vraptor vai passar um produto nulo no seu método:
public void adiciona(final Produto produto){
//se eu não digitei nada no formulário, produto == null!!!
//por isso o NullPointerException abaixo:
if (produto.getNome() ......)
}
pra corrigir é só fazer:
public void adiciona(final Produto produto){
if (produto == null) {
validator.add(....);
} else {
//outras validações
}
validator.onErrorUse(...)
//resto do método
}
PS: Lita, coloque os códigos que vc postar entre [code] e [/ code] (sem o espaço dentro da tag), assim fica mais fácil de ler
@Resource
public class ProdutosController {
private final ProdutoDao dao;
private final Result result;
private final Validator validator;
public ProdutosController(ProdutoDao dao, Result result, Validator validator){
this.dao=dao;
this.result=result;
this.validator=validator;
}
public void adiciona(final Produto produto){
if(produto.getNome()==null||produto.getNome().length()<3){
validator.add(new ValidationMessage(“Nome é obrigatório e precisa ter mais de 3 letras”,“produto.nome”));
}
if(produto.getDescricao()==null||produto.getDescricao().length()>40){
validator.add(new ValidationMessage(“Descrição é obrigatória não pode ter mais de 40 letras”,“produto.descricao”));
}
if(produto.getPreco()<=0){
validator.add(new ValidationMessage(“Preço precisa ser positivo”,“produto.preco”));
}
validator.onErrorUse(page()).of(ProdutosController.class).formulario();
dao.salva(produto);
result.redirectTo(ProdutosController.class).lista();
}
public void formulario(){
}
public List lista(){
return dao.listaTudo();
}
public Produto edita(Long id){
return dao.carrega(id);
}
public void altera(Produto produto){
dao.atualiza(produto);
result.redirectTo(ProdutosController.class).lista();
}
public void remove(Long id){
Produto produto=dao.carrega(id);
dao.remove(produto);
result.redirectTo(ProdutosController.class).lista();
}
}
henriquejhc, o que a Lita fez está correto sim, acho que você se enganou:
Se isso OU isso. Ou seja, nunca dará NullPointerException aqui.
Lita, já que agora nenhuma mensagem de erro aparece, e tudo que você consegue nos passar é que está ficando na mesma tela, acho que só um debug para entender o que está acontecendo.
Então pergunto: o que seria ficar na mesma tela? Essa mesma tela por acaso é a ProdutosController.formulario? Caso sim então o validar está fazendo certo, pois você diz que quando dá erro deve ir para o formulário.
Você verifica se é igual a null e depois tenta verificar o tamanho.
Se for null vai NullPointerException.
(Não testei, logo não posso afirmar que seja isso)
Espero ter ajudado.
[/quote]
Camarada você precisa estudar um pouco mais lógica de programação, pois se for tentar ajudar alguém com uma resposta errada é melhor nem tentar…
Em nenhum momento ocorreria o erro mencionado por você, pois no IF esta sendo utilizado o OR ||, sendo assim, quando a primeira condição estiver VERDADEIRA ele não irá testar a segunda condição, ou seja, não irá testar a outra condição após o OR ||, só iria testar se fosse utilizado o AND &&.
Tome cuidado para não direcionar a pessoa para um erro ainda maior.