Dúvidas pontuais no Tutorial do vRaptor3

[quote=Lucas Cavalcanti]Veja se você está usando as convenções direitinho:

a o método:

@Resource
public class ClienteController {
   public void lista() {...}  
}

[/quote]

Oi Lucas, tudo blz?! :wink:

Comecei a estudar o vRaptor e o Tut da Caelum!
Antes de entrar no Validations, fiquei tão ansioso (e entusiasmado 8) ) com o Frame, q eu decidi logo comentOut as Annotations na Entidade Produto e “improvisar” +/- 1 mock na DAO p/ ver a página lista.jsp funcionando.
Além disso, tive q adicionar o import da .TLD Core da JSTL. Porém, agora apresenta o seguinte erro: “
br.com.caelum.vraptor.view.ResultException: javax.servlet.ServletException: javax/el/ValueExpression
br.com.caelum.vraptor.view.DefaultPageResult.forward(DefaultPageResult.java:69)
br.com.caelum.vraptor.extra.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:59)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
…”

Ah, no Tutorial está deste jeito:

public List<Produto> lista() { return dao.listaTodos(); }
Afinal, Qual é a maneira (convenção) correta??! :roll:
Thnx in advance,

se está dando javax/el/ValueExpression é pq vc está (ou não) com o standard.jar ou jstl.jar no WEB-INF/lib… talvez vc tenha que colocar (ou tirar) esses jars

qto à convenção, você usa o retorno se quiser que o VRaptor jogue o retorno pra view automaticamente… nesse caso o nome do atributo jogado seria produtoList.

se não quiser usar o retorno, vc pode usar o

result.include("produtos", produtos);

(Obs.: na pág. ‘form.jsp’ eu adicionei o import jstl/core e a tag <c:url (colocada no atrubuto action=’’’) passou a funcionar adequadamente. Então, desta forma, achei q não iria ter problemas com a c:forEach em ‘lista.jsp’ :shock: )

Mas, realmente na aplicação/projeto disponibilizada estava faltando o ‘standard.jar’. Adicionei-o; acabei tendo alguns problemas de ‘deferredExpression’ e acabei adicionando tb o ‘jstl.jar’ (da mesma versão do meu standard.jar) no lugar dos 2: ‘jstl-api-1.2.jar’ e ‘jstl-impl-1.2.jar’ (q creio ser útil para v6 q estão desenvolvendo o FrameWork) tendo em vista q tive q alterar a especificação da Aplicação de JavaWeb 2.5 para 2.4, pois só posso usar TomCat 5.5 => Valews mesmo pela dica!! :wink:

Ah, tenho + 1 dúvida. Poderia trocar toda a Convenção ‘form’ por, por exemplo, ‘manter’??! (Ou ‘form’ é 1 “convenção interna” do vRaptor??)
grato,

Derlon

vc diz o nome do método? Você pode usar o nome que quiser… se mas se vc tiver o método ProdutoController.manter() ele vai responder à URI /produto/manter
e vai pra jsp /WEB-INF/jsp/produto/manter.jsp

Ah, perfeito!! O vRaptor é extremamente CoC mesmo! :thumbup: Sakei!! 8)
Agora estou tentando utililizar a Validação Clássica da seguinte forma:

[code]
public void adiciona(final Produto produto) {
if (produto.getNome() == null)
validator.add(new ValidationMessage(“erro”,“nome.vazio”));
if (produto.getPreco() < 1)
validator.add(new ValidationMessage(“erro”,“preco.invalido”));
validator.onErrorUse(Results.page()).of(ProdutosController.class).form();

	dao.adiciona(produto);
	result.redirectTo(ProdutosController.class).lista();
}

[/code]e o Console apresenta: "
.
.
14:58:50,360 DEBUG [JstlLocalization ] couldn’t find message bundle, creating an empty one

14:58:50,376 DEBUG [DefaultStaticContentHandler] Deferring request to container: /OnLineStore/WEB-INF/jsp/produtos/form.jsp
14:58:50,376 DEBUG [VRaptor ] VRaptor ended the request
"
Por gentileza, me confirme: seria 1 mito o q dizem q quando usar o estilo clássico não precisar adicionar 1 arquivo messages.properties??! :roll:
Ah, e em outro tópico vc falou

Eu não pude encontrar! :frowning: Em todo caso, onde tem disponível para DownLoad??!
E só + 1 duvidinha: no vRaptor existe alguma forma de fazer Valicação de forma centralizada (bem ao estilo do Seam), ou seja, em 1 só local definir a Validação para q seja gerada tanto Server-side como Client-side??! :mrgreen:

esse erro do bundle q dá é só log… vc pode ignorar ele

http://tinyurl.com/vr3dl vraptor-3.1.1.zip

[quote=derlon]
E só + 1 duvidinha: no vRaptor existe alguma forma de fazer Valicação de forma centralizada (bem ao estilo do Seam), ou seja, em 1 só local definir a Validação para q seja gerada tanto Server-side como Client-side??! :mrgreen:[/quote]
não tem nada pronto nesse sentido ainda…

Agora voltou a funfar novamente! :wink:

Então apenas me confirme: seu eu usar o HamCrest, sou “obrigado” a adicionar o messages.properties no meu default src??!
Bem, continuando a minha saga do tutorial do vRaptor3: estou tentando fazer a Validação Estilo Fluente, porém adicionando no messages o seguinte:
greater_than = maior que
required_field = {0} é um Campo Obrigatório

Form Produtos

produto.nome=Nome
produto.preco=Preço

No método da Controller a seguinte validação:

validator.checking(new Validations() {{ that(!(produto.getNome().isEmpty() ), "Preenchimento Obrigatório", "required_field", "produto.nome"); that(produto.getPreco() > 0, "produto.preco", "greater_than", "Valor Inválido"); }}); acabo obtendo na Página as Mensagens da seguinte forma:
* Preenchimento Obrigatório produto.nome é um Campo Obrigatório
* produto.preco maior que
Ou seja, como faço para passar o Nome do Campo como parâmetro para a ‘Msg de Campo de Preenchimento Obrigatório’ de forma adequada??

[quote=Lucas Cavalcanti]

[quote=derlon]
E só + 1 duvidinha: no vRaptor existe alguma forma de fazer Valicação de forma centralizada (bem ao estilo do Seam), ou seja, em 1 só local definir a Validação para q seja gerada tanto Server-side como Client-side??! :mrgreen:[/quote]
não tem nada pronto nesse sentido ainda…[/quote]
E neste caso você saberia dizer se eu poderia usar/adotar o plugIn Validator da Lib Commons (da Apache; assim como fazemos no Struts1.x)??

Não sei se obrigado, mas é recomendável fazer isso

tente colocar nas validações:

greater_than = deve ser maior que {0}
required_field = {0} é um Campo Obrigatório
# Form Produtos
produto.nome=Nome
produto.preco=Preço

No Controller:

		validator.checking(new Validations() {{
			that(!(produto.getNome().isEmpty() ), "produto.nome", "required_field", "Nome");
			that(produto.getPreco() > 0, "produto.preco", "greater_than", "0");
		}});

[quote=derlon]
E neste caso você saberia dizer se eu poderia usar/adorar o plugIn Validator da Lib Commons (da Apache; assim como fazemos no Struts1.x)??[/quote]
Nunca tentei fazer isso… mas teoricamente vc pode usar esse plugin sim…

[quote=Lucas Cavalcanti ]No Controller:

validator.checking(new Validations() {{ that(!(produto.getNome().isEmpty() ), "produto.nome", "required_field", "Nome"); ... [/quote]
Vc sugeriu passar a String [color=blue]“Nome”[/color] no 4° parâmetro: isso não violaria o princípio da Internacionalização??
Bem, relembrando q estou seguindo o exemplo do tutorial, a JSP está assim:

<li>${error.category} ${error.message}</li> Considerando passar uma [color=red]String vazia[/color] no 2° parâmetro (o da Categoria de Erro) e tb no .properties fiz as seguintes alterações:
greater_than = {0} maior que {1}!
produto_nome=Nome

e no Controller:

			that(!(produto.getNome().isEmpty() ), "", "required_field", "produto_nome");
			that(produto.getPreco() > 0, "", "greater_than", new String[]{"produto.preco", "0"});

acabo obtendo a seguinte (validação gerada):
* produto_nome é um Campo Obrigatório
* produto.preco maior que 0!

Ou seja, “o vRaptor” não está substituindo as chaves de Nome de Campo pelo seus respectivos Valores do arquivo de messages (lançando a String a propria chave (passada no Parâmetro))! :oops: Será q estou fazendo algo errado??!

vc não está fazendo nada de errado… é o vraptor que não internacionaliza os parâmetros da mensagem mesmo… =S

posso marcar como bug e corrigir isso… mas por enquanto o jeito mais fácil de fazer isso é colocando o texto não internacionalizado mesmo…

outra coisa: vc não precisa colocar a categoria do erro no jsp se vc não quiser

Olá Lucas,

Estou começando a estudar o Vraptor e estou tendo um problema similar ao do Derlon.
Estou também tendo este erro:
"
br.com.caelum.vraptor.view.ResultException: javax.servlet.ServletException: javax/el/ValueExpression
br.com.caelum.vraptor.view.DefaultPageResult.forward(DefaultPageResult.java:69)
br.com.caelum.vraptor.extra.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:59)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

Tenti realizar as modificações sugeridas por voces no forum.
EU substitui o ‘jstl-api-1.2.jar’ e ‘jstl-impl-1.2.jar’ pelos ‘jstl.jar’ e ‘standard.jar’, Com isso, a exceção assim deixou de acontecer, entretanto, em vez de aparecer os valores do meu objeto produto apareceu a seguinte linha no meu navegador:

  • ${produto.nome} - ${produto.descricao}
    "

Voces saberia me ajudar a esclarecer este meu problema ?

Minha segunda duvida é com relação ao stack trace. atualmente os error que ocorrem apenas estão aparecendo no navegador e não no console do meu eclipse, saberia dizer o q preciso modificar para fazer todos os error aparecerem no console do eclipse ?

Muito obrigado pela atenção, abaixo estarei colocando meu codigo jsp e meu Controler.

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page import="java.util.Map"%>
<%@page import="javax.servlet.jsp.jstl.core.*"%>
<%@page import="java.util.Set"%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<ul>
<c:forEach items="${produtoList}" var="produto">
    <li> ${produto.nome} - ${produto.descricao} </li>
</c:forEach>
</ul>
</body>
</html>
package br.com.caelum.vraptor.blank.controller;

import java.util.ArrayList;
import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.blank.entity.Produto;

@Resource
public class ProdutosController {
	
	private Result result;
	public ProdutosController(Result result){
		this.result = result;
	}
	public List<Produto> list() {
		List<Produto> prodList = new ArrayList<Produto>();
		Produto p = new Produto();
		p.setNome("teste");
		p.setDescricao("teste");
		prodList.add(p);
		result.include("teste", "teste");
		return prodList;
	}

}

Tenta trocar a primeira linha por:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>  

deveriam estar aparecendo no console tb… vc tá olhando no console do servidor? qual servidor vc tah usando?

Olá Lucas, Sua dica resolveu meu problema

Muito obrigado.

Com relação ao servido estou usando o tomcat 5.5, a saída do console mostrou a parto do carregamento do sistema, e outras coisas, entretanto, quando o erro ocorreu ele só apareceu no navegado e não no consolo

obrigado pela ajuda

Oi Lucas, (foi mal, o delay :-()

Muito obrigado p/ ajuda, dicas e conselhos!! :thumbup:

Só postei p/ avisar q estou 20 dias de férias, mas logo volto p/ continuar a saga!! 8)
Mas, meus parabens p/ vc, o Silveira, todo o pessoal do vRaptor… A idéia do FrameWork é fenomenal, o vRaptor está cada dia melhor, continuem o ótimo trabalho !! :XD:

A gente se fala,

Derlon

derlon, agora o vraptor tá internacionalizando os parâmetros das mensagens, mas vc precisa fazer:

//validations
  that(a  > b, "categoria", "mensagem_key", i18n("parametro_internacionalizado"), "parametro não internacionalizado");

baixe o snapshot pra poder fazer isso:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.2-SNAPSHOT/vraptor-3.1.2-20100310.010227-4.jar

Oi, Lucas

Substituí o vraptor-3.1.1.jar pelo o (nightly build) q vc me indicou e funfou 100%!! 8) Grato p/ melhoria!!
Apenas 1 observação: para q o Valor da Categoria (de Erro) seja mostrado na .JSP (em vez da Chave), seu parametro tb precisa ser passado c/ a função i18n(“categoria_internacionalizada”), por exemplo, desta forma:

that(!(produto.getDescricao().isEmpty() ), i18n("mandatory.field"), "required_field", i18n("produto_descricao")); Obtendo:
* Preenchimento Obrigatório: Descrição é um Campo Obrigatório.

Agora, estou tentando internacionalizar os Campos assim:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <fmt:message key="produto_nome"/><br /> , porém tudo q consigo é a Key (chave) entre interrogações (deste jeito):
???produto_nome???

Lucas, saberia dizer qual é o problema??!

vc precisa registrar o bundle de mensagens no web.xml… tem um exemplo de como fazer isso no mydvds

Legal! É usado o esquema padrão de i18n da JSTL! :wink:

Só q agora percebe-se q somente os Nomes dos Campos são internacionalizados. Mas, as mensagens das Validações são exibidas os Valores, porém sem internacionalizar (na verdade isto já estava acontecendo, tanto no EI, como no FireFox).

Ah, outro problema: sempre q faço 1 request p/ 1 Controller da minha Aplicação, no Internet Explorer, apresenta seguinte a msg de Erro (quando tento acessar ‘[color=darkblue]http://localhost:8080/vRaptor-OnLine-i18n-project/produtos/form[/color]’ p/ ex.):

[code]
HTTP Status 404 - /vRaptor-OnLine-i18n-project/WEB-INF/jsp/produtos/form.image/gif.jsp


type Status report

message /vRaptor-OnLine-i18n-project/WEB-INF/jsp/produtos/form.image/gif.jsp

description The requested resource (/vRaptor-OnLine-i18n-project/WEB-INF/jsp/produtos/form.image/gif.jsp) is not available.


Apache Tomcat/5.5.28
[/code]Aí, eu sempre tenho q Refresh p/ ver a página direito.

O pode estar causando estas issues??!

isso só acontece no IE? não faz mto sentido…

vc tem uma imagem chamada image.gif na página de form? como vc está referenciando ela?

Não, não tem nenhuma imagem no meu projeto (q é apenas o Blank, fornecido p/ site do vRaptor (apenas renomeei o Nome do Projeto p/ ‘vRaptor-OnLine-i18n-project’), adicionados apenas recursos de validação e i18n).

E sim, só acontece no IE. Bem, nunca testei em outros browsers, mas no FF tudo sempre funciona ok!! No entanto, no EI a única pág. q carrega de cara é quando eu starto a Aplicação e ela chama a pág. index.jsp! :shock:

E c /relação à i18n (das MSGs de Validação)??! :frowning: