ErrorMessage[RESOLVIDO]

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

alguém saberia me dizer o motivo do erro???

obrigada!

ah esqueci de informar no header.jspf que fica na pasta webContent, coloquei a seguinte informação:

<div id="erros">
	<ul>
	<c:forEach items="${errors}" var="error">
	<li>${error.category}-${error.message}</li>
	</c:forEach>
	</ul>
</div>

mas acho que o header.jspf esta no local errado por que, seguindo a postila fala para colocar :




  • <a href="<c:url value="/produtos/formulario"/>">Novo Produto

  • <a href="<c:url value="/produtos/lista"/>">Lista Produtos


dentro do header.jspf e o certo era aparecer Novo produto e Lista de produtos…na web mas não esta aparecendo

alguém tem alguma dica?

Oi, posso estar errado mas nessa linha :

if(produto.getNome()==null||produto.getNome().length()&lt;3){ 
   .................
}

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.

desculpa mas não entendi exatamente o que vc quis dizer!!!

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.

Espero ter ajudado.

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:

validator.onErrorUse(page()).of(ProdutosController.class).formulario();

vc injetou o validator no seu controller?

“injetou”???..desculpa mas como assim?

o vraptor faz injeção de dependência pelo construtor

então é só vc informar que vai receber o validator no seu construtor

vc colocou o validator no seu construtor??

coloca o controller inteiro aqui, mas dentro das tags code

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();
}
}

Tira o modificador final dos atributos da classe

do validator, result e do DAO

tirei os modificadores mas continua dando erro:( :

br.com.caelum.vraptor.InterceptionException: java.lang.NoClassDefFoundError: net/vidageek/mirror/dsl/Mirror

Agora vc tem q colocar no seu classpath o jar do Mirror

zoren add…agora não dá erro…mas também não aparece a mensagem de erro só continua na mesma página!!!

add??

Não entendi oq vc quis dizer com add,

Mas, quanto a não aparecer erro nenhum, vc criou o arquivo messages??

edit:

ata saquei, vc colocou o jar no classpath

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.

validator.onErrorUse(page()).of(ProdutosController.class).formulario(); dao.salva(produto); result.redirectTo(ProdutosController.class).lista();

Lita, está tudo certo agora, ele tem que mostrar a mesma página pra te mostrar os erros…

Veja se está colocando o header.jspf nas suas páginas, lá no web.xml vc tem que colocar isso aki:

<jsp-config> <jsp-property-group> <display-name>Todos Jsp's</display-name> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> <include-prelude>/header.jspf</include-prelude> <include-coda>/rodape.jspf</include-coda> </jsp-property-group> </jsp-config>

vc tem um arquivo “[nome do arquivo].css”?

[quote=henriquejhc]Oi, posso estar errado mas nessa linha :

if(produto.getNome()==null||produto.getNome().length()&lt;3){ 
   .................
}

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.