Duvida com VALIDATOR do VRaptor

43 respostas
T

Olá pessoal!
Estou tendo uma duvida com o Validator do VRaptor, seguindo a apostila da Caelum.
Apliquei as validation tags nas entities :

@NotEmpty(message="O título não pode estar vazio!") private String titulo;

Agora preciso implementar isso na logic, correto?
Com oque tinha na apostila, nao consegui…
Coloquei assim :

@Validate(params={"cd"}) public void armazena (Cd cd) {
e tomei essa exception na cara :

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.NullPointerException

org.vraptor.VRaptorServlet.service(VRaptorServlet.java:99)

javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NullPointerException

org.vraptor.plugin.hibernate.HibernateLogicMethod.validateObject(HibernateLogicMethod.java:120)

org.vraptor.plugin.hibernate.HibernateLogicMethod.validateField(HibernateLogicMethod.java:82)

org.vraptor.plugin.hibernate.HibernateLogicMethod.validate(HibernateLogicMethod.java:57)

org.vraptor.core.ValidatorEngine.validate(ValidatorEngine.java:35)

org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:101)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:58)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

lojavirtual.store.DAOInterceptor.intercept(DAOInterceptor.java:17)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:38)

org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)

org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:98)

org.vraptor.core.DefaultController.execute(DefaultController.java:46)

org.vraptor.VRaptorServlet.service(VRaptorServlet.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Alguem sabe o que pode estar acontecendo? O que posso ter esquecido?
Nota, estou usando o VRpator 2.5 e o HIbernate Validator 3.0

Thanks

43 Respostas

Lucas_Cavalcanti

Olá,

você está passando algum parâmetro para a requisição, do tipo cd.titulo=Abc, cd.id=2, e coisas do tipo?

já deu uma olhada no VRaptor 3? http://vraptor.caelum.com.br/documentacao/

[]'s

T

Opa… vlw pela atenção…
Entao… eu estou fazendo um trabalho de faculdade co urgencia me baseado nisso, porisso q estou seguindo a risca e nao quis mudar pro VRptor 3… nem o os validators do hibernate…
O pessoal que pega ess aapostila q é iniciante q nem eu dev eter muita dificuldade, pq se vai buscar na net os jars, pega tudo atualizado. E dai vai dar um monte de erro.
Eu apaguei tudo oq eu tinha feito de validations com o hibernate e VRaptor e refiz… dai deu certo… devia ter escritoo algo errado. Quando terminar o projeto eu vou postar ele auqi no forum pra galera ter um pronto ja pra se basera e vou tentar deixar todas as coisas q eu tive dificuldade e que me fiseram perder mt tempo…
Estou agora com outra duvida no mesmo projeto. A duvida é a seguinte :
Qaundo sou lançado da tela de cadastramento de algum produto para a tela que lista os produtos, se dou um refresh na pagina (f5), ele adiciona outro produto identico…
Imagino que em algum lugar eu devia estar zerando alguma coisa… e nao estou. Engraçado q eu nao vi nada na apostila…
Alguem sabe isso?

Abraços!

Lucas_Cavalcanti

Olá,

esse problema do F5 acontece por causa de uma diferença entre redirect no cliente e redirect no servidor…

dá uma olhada nessa página: http://vraptor.caelum.com.br/documentacao/view-e-ajax/ na seção Redirecionamento e Forward

pra resolver esse problema no VRaptor2, você precisa ir na linha do views.properties que redireciona do adiciona.ok para a listagem,
e colocar um “redirect:” na frente:

produto.adiciona.ok = redirect:produto.lista.logic

ou algo parecido com isso

[]'s

T

Blza cara… deu certissimo… esse era o pior bug q tava dando no meu sisteminha…
Ow… c sabe como eu faço pra setar um boolean pelo form usando um checkbox sem usar javascript?
Na verdade nem com javascript eu consegui…
Fiquei em duvida tbem se na entity eu deveria colocar esse boolean como objeto ou primitivo…
Achei q se o user nao clicasse na check box ele ia setar com false… e se clicasse como true…
A parte do true funfa…mas se nao dar um check, fica como null a propriedade…
Pensei em colocar como primitivo, q ja vem com o valor false como padrao, mas ai o vraptor tenta jogar null no primitivo, oq logicamente da uma exception na minha cara… :stuck_out_tongue:

Obrigado mais uma vez pela ajuda… c trampa na caelum?

Lucas_Cavalcanti

olá,

o problema com checkboxes eh que qdo eles estão checados eles vão pra requisição, e quando não estão checados eles não vao pra requisição.

vc tá recebendo o boolean como argumento do método, ou dentro de outro objeto?

se for como argumento do método, você pode receber o Boolean e se estiver null vc toma o valor como falso…
se for dentro de outro objeto, vc pode usar boolean, pois se o parâmetro não vier na requisição (checkbox não checado) o vraptor não vai tocar no campo boolean e ele vai ficar falso…

e sim, eu sou da caelum =)

T

entao veio… o esquema ta dentro do objeto…
Tenho um objeto produto e tem dentro dele um boolean “promocional”…
quando eu tentei deixar como boolean, nao rolou… deu a exception q eu te falei, sacou…
oq eu posso fazer é colocar logica dentro do codigo pra setar isso quando tiver null… mas achei q seria meio gambiarra… queria fazer o esquema que vc falou ai funcionar…
c tem ctza q se for primitivo e tiver dentro do objeto produto, o vraptor nao reclama? pq peloq eu to vendo, mesmo se nao tiver clicado, ele tenta jogar null no atributo promocional…

Legal… ja fiz um curso de java preparatorio pra certificacao ai… passei! lol

T

affe… mandei duas vezes a msg…

Lucas_Cavalcanti

o Vraptor não vai tentar setar null, pq o parâmetro nem vai pra requisição… o vraptor só mexe nos parametros que vem da requisição…

parabéns pela certificação =)

T
Uai... q doidera... to fazendo alguma outra coisa errada entao.. olha como ta meu jsp :
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Cadastro de Produtos</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />

</head>
<body onload="init();">
<%@ include file="../menu.jsp" %>
<h1>Cadastro de Produtos</h1>
<form action="product.saveOrUpdate.logic" method="post">
	<input type="hidden" name="product.id" value="${product.id}"/>
	Nome: <input type="text" name="product.name" value="${product.name}"/><br />
	Price: <input type="text" name="product.price"  value="${product.price}"/><br />
	Promocional: <input type="checkbox" name="product.promotional"  value="${product.promotional}"/><br />
	Tipo Produto: 
	<select name="product.productType.id" >
		<c:forEach var="productType" items="${productTypeList}">
			<option value="${productType.id}" <c:if test="${product.productType.id == productType.id}">selected="true"</c:if> >${productType.name}</option>
		</c:forEach>
	</select>
	<ul id="errors">
		<c:forEach var="error" items="${errors.iterator}">
			<li>${error.key}</li>
		</c:forEach>
	</ul>
<input type="submit" /></form>
</body>
</html>

e se liga na exception.... mesmo se eu setar com true.... da erro dos dois jeitos

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Null value was assigned to a property of primitive type setter of lojavirtual.bean.Product.promotional
org.vraptor.VRaptorServlet.service(VRaptorServlet.java:95)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of lojavirtual.bean.Product.promotional
org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:83)
org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3571)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:133)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
org.hibernate.loader.Loader.doQuery(Loader.java:729)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
org.hibernate.loader.Loader.doList(Loader.java:2213)
(...)

root cause

java.lang.IllegalArgumentException: Can not set boolean field lojavirtual.bean.Product.promotional to null value
sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
sun.reflect.UnsafeBooleanFieldAccessorImpl.set(Unknown Source)
java.lang.reflect.Field.set(Unknown Source)
org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:79)
org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3571)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:133)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
org.hibernate.loader.Loader.doQuery(Loader.java:729)
(...)

Lucas_Cavalcanti

então…

o atributo value do checkbox é o que vai pra requisição, o que vc quis fazer é isso:

Promocional: <input type="checkbox" name="product.promotional"  value="true" 
     <c:if test="${product.promotional}">
         checked="checked"
     </c:if>
/><br />

ou seja, o chk vai estar checado se ${product.promotional} for true…

o que estava acontecendo, eh que o HTML gerado era:

Promocional: <input type="checkbox" name="product.promotional"  value=""/><br />

então quando vc checava o chk ele mandava pra requisição

product.promotional=

que o vraptor traduz como null e dá pau…

e se eu não me engano vc não precisa colocar o value=“true”, isso é o padrão de um chkbox

[]'s

T

Blza… vou testar.,…
ow… eu to tentando setar um Double e ta dando erro de cast… `

Nov 21, 2009 1:31:09 AM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet vraptor2 threw exception

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String

at org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator.java:36)

at org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:385)

at org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:351)

Onde no VRaptor eu vejo como ele ta setando? Ele ja nao tenta fazer a conversao automatica?

Lucas_Cavalcanti

você não pode colocar @NotEmpty num campo Double, só vale para strings (e collections, talvez)…

troque por @NotNull

[]'s

T

HAUHAUAHUAHAUHA
porra… q noob!
logico… not empty é pra nao ser nem nulo e nem vazio… drrrrrrrrrrrrrrr
vlws cara…

cara… vi isso aqui na apostila e acho q ta errado… se liga :

c:forEach var="musica" items="${cd.musicas}">
<li class="musica" id="musica-${musica.id}">
${musica.titulo} - ${musica.preco}
</li>
</c:forEach>

Esse “-” entre musica e musica.id existe??? (id=“musica-${musica.id}”>) pq ele ta pegando o meu id e colocando um - na frente… pegando id negativo…

Lucas_Cavalcanti

acho que tá certo sim…

é pro id do li ficar algo do tipo

musica-45
musica-229

etc…

é só um separador =)

T

ow lucas… cara… tentei ja um monte de coisa aqui… revisei codigo… mas o id do produto nao consegue chegar no carrinho nem com reza brava…
olha como ta meu codigo :

<div id="productTypeList">
<c:forEach var="productType" items="${productTypeList}">
	<div id="${productType.id}" class="productType">
	<span class="name">${productType.name}</span>
	<span class="nameSubType">${productType.nameSubType}</span>
	<hr />
	<ol>
		<c:forEach var="product" items="${productType.productList}">
			<li class="product" id="${product.id}" value="${product.id}">${product.name} - ${product.price}</li>
		</c:forEach>
	</ol>
	</div>
</c:forEach>
</div>

<div id="userProductList">
	<h2>Meu Carrinho</h2>
	<div id="compras">
		<c:import url="userProductList.list.logic" />
	</div>
</div>

por onde isso passa antes de chegar na logic? pq ja chega na logic tudo zerado…
tentei tbem sem o value=“product.id”, como esta na apostila, mas nao deu…
Onde isso pode estar errado? pq eu so tou sabendo olhar na jsp e na logic… acho q isso deve passra por outro lugar antes…

so mais um adendo q pode ter algo a ver…
no meu javascript , ta assim :

function updateUserProductList(drag) { id = drag.id.substr(7); $('#compras').load('userProductList.add.logic', {'product.id': id}); }

T

afffeeeeeeeeeeeee
porisso odeio ctrl c e ctrl v
vc sempere faz merda…
oq acontece é q esse metodo ta esperando q eu coloque uma string grande no id… e dai fazer um substring pra pegar so o numero…
drrrrr
foi so tirar o substring, uma vez q meu id tá so o numero, que deu certo…

Vamo q vamo… lol

T

Olá novamente!
Gostaria de saber se tem alguma coisa de especial pra vc fazer um carrinho dar um refresh quando vc sai do site e volta…
Pq eu to vendo q ele ta guardando ainda os itens na sessao, mas so apareece quando vc arrasta outra coisa pro carrinho…
Como se nao estivesse atualizando… o carrinho fica em branco enquanto vc nao arrastar… e nao adianta dar refresh na pagina…
Na apostila fala q deveria funcionar mas o meu nao ta funcionando…

Lucas! Vi sua foto na Mundo Java desse mês… falando sobre VRaptor 3 pra variar… hahaha

Abraço

Lucas_Cavalcanti

estranho isso estar acontecendo…

quando vc coloca algo na sessão, isso fica disponível enquanto a sessão durar… sair da página e voltar nem sempre invalida a sessão…

eh estranho o carrinho ficar vazio, e se vc adicionar algo voltar tudo que estava antes… vc tah guardando algo no banco? ou não está usando o carrinho da sessão?

T

nao salvo nada no banco… to deixando tudo na sessao mesmo…
testei mais umas coisas ontem… quandco eu dou f5 na pagina, some os itens tbem… e reaparece toda a lista de eu puxar um pra dentro.

Acho q seria questao de dar um refresh nesse campo usando ajax… nao seria nao?
estranho q o meu ta tudo semi-igual a apostila… devia funfar… :frowning:

to tendo mais algumas duvidas, mas nao pesquisei sobre elas direito…
oq ta mais me azucrinando é isso ai…

tem algo q eu poderia tentar fazer pra contornar isso?

AbXXX

G

O ideal nesse caso é fazer um debug e até mesmo deixar uns eggs nas telas imprimindo dados da sessão e afins, para você achar um potencial erro de programação.

Minha dica inicial é ver se a sessão está sendo a mesma. Para isso mande imprimir nas suas páginas (ou até mesmo no console) o ID da http-session, e veja se em algum momento ela muda. Caso sim está acontecendo algo.

Além disso verifique se você não possui nenhum atributo de classe como estático com os dados de request e session.

Lucas_Cavalcanti

acho que vc tem que tentar ver se o problema está no jsp que está mostrando errado, ou a session que não tá guardando os dados…

tenta entrar em debug no seu controller (lógica) e ver se os dados estão na sessão qdo não mostra nada na tela

T

Entao garcia... eu sou meio noob... nao entendi direito sua dica... haha nao sei nem oq sao eggs....

Lucas, cara... a sessao nao ta se perdendo, pq aundo vc volta pra pagina e adiciona, a lista ainda esta lá.. o problema é q ela fica invisivel.. sabe-se la como... vou postar o codigo do meu carrinho :
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<ul>
	<c:forEach var="product" items="${userProductList.productList}">
		<li class="compra"><b>${product.name} ${product.price} </b> <br />
	</c:forEach>
</ul>
<div id="total">
	Total: $${userProductList.total}
</div>[code]
Lucas_Cavalcanti

Como vc popula a variável userProductList?

é um atributo de sessão? (session.setAttribute(…))?
é um atributo do request? (request.setAttribute(…))?

ou vc apenas deixa o VRaptor popular essa lista? (algum método que retorna List)?

[]'s

T

cara… eu nao dei ate agora nesse projeto do ECommerce da caelum nenhum session.setAttribute ou request.setAttribute…
acredito entao q quem esta fazendo tudo é o VRaptor…
declarei a lista assim, pra deixar ela na sessao…

@In(scope=ScopeType.SESSION, required=false)
	@Out(scope=ScopeType.SESSION)
	private UserProductList userProductList = new UserProductList();

e setei assim quando chamo a logica de addProduct :

public void add (Product p) {
		System.out.println(p.getId()+"  id produto");
		Product product = this.factory.getProductDAO().find(p.getId());
		this.userProductList.addProduct(product);
	}

só isso cara…
sera q é algo na view?

Lucas_Cavalcanti

tira o “= new UserProductList()” e coloca um “create=true” no @In e vê se funciona…

qdo vc dah o new, ele sobrescreve o que tá na sessão…

T

mesma coisa cara… ainda fica tudo inv…
eu ainda acho q é alguma coisa na altura da view, pq eu nao to perdendo os dados… eles simplesmente nao aparecem… deve ser alguma coisa q eu tenho q renovar… ou dar um refresh dentro do carrinho…
q q c acha?

Lucas_Cavalcanti

tenta tirar o new, e colocar a propriedade (key = “userProductList”) no @In e no @Out
isso deveria ser o padrão…

o problema não está na view, eu acho…

T
@In(scope=ScopeType.SESSION, required=false, create=true, key = "userProductList")
	@Out(scope=ScopeType.SESSION, key = "userProductList")
	private UserProductList userProductList;
assim? se for assim nao funfou nao... po... mas como pode ser na logica se na logica a lista ta cheia de produtos? nao faz sentido pra mim isso... talvez o erro possa estar aqui, no cara q faz boa parte das coisas acontecerem...
function updateUserProductList(drag) {
	id = drag.id;
	$('#compras').load('userProductList.add.logic', {'product.id': id});
}
$(function(){
	$('.product').Draggable({
		ghosting: true,
		opacity: 0.7,
		zIndex: 10,
		revert: true
	});
	$('#userProductList').Droppable({
		accept: 'product',
		onDrop: updateUserProductList
		
	});
});
T

ahh lucas… ctza q é alguma coisa na view… eu troquei o nome de muita coisa no projeto… ate mesmo pra nao ficar dando mt ctrl c e ctrl v…
acabei de ver aqui q no arquivo JS que faz mt coisa por tras funcionar, tem uma referencia a compras… mas compras foi a unica coisa q eu nao mudei…
pode ter outra coisa q o javascript ta tentando fazer load e nao ta conseguindo pq nao ta achando…

Lucas_Cavalcanti

hum… certo… vc não tá carregando a lista da primeira vez, só tá fazendo isso via javascript qdo vc arrasta algo pro carrinho?

T

Achoq nao… onde eu faria isso?
os unicos codigos q eu fiz relacionados ao carrinho ja postei…
tem alguma coisa q eu possa fazer pra no onload da pagina carregar os itens q estao na sessao, no objeto userProductList?

Lucas_Cavalcanti

vc pode chamar a função

function updateUserProductList(drag) {  
   id = drag.id;  
   $('#compras').load('userProductList.add.logic', {'product.id': id});  
}

modificada pra não adicionar nenhum produto, no onload da página, ou fazer a lógica de listar os produtos dentro do div do carinho…
(o que está no resultado do userProductList.add.logic)

T

c ara… ficaria assim?

<body class="body" onload="loadUserProductList();">

e na funtion:

function loadUserProductList() { $('#compras').load('userProductList'); }

acho q nao né? pq nao funfou… hehe

Lucas_Cavalcanti

sabe o que tá no arquivo: userProductList/add.ok.jsp?

coloca dentro da <div id="compras>…

T

Entao cara… eu nao tenho o add.ok.jsp… eu só tenho o list.ok.jsp…
será q é isso? acho q na apostila nao fala pra fazer o add.ok.jsp…
meu list ta assim :

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<ul>
	<c:forEach var="product" items="${userProductList.productList}">
		<li class="compra"><b>${product.name} ${product.price} </b> <br />
	</c:forEach>
</ul>
<div id="total">
	Total: $${userProductList.total}
</div>

dai pelo q entendi isso é chamado no retorno do metodo userProductList.list.logic, nessa parte do carrinho :

<div id="userProductList">
	<h2>Meu Carrinho</h2>
	<div id="compras">
		<c:import url="userProductList.list.logic" />
	</div>
	<a href="store.form.logic?KeepThis=true&TB_iframe=true&height=300&width=400"
		class="thickbox" title="Finalizar compra">
		Finalizar compra
	</a>
</div>

enquanto vc nao respondia, tentei chamar de um monte de jeito pelo javascript… nao deu… to começando a achar q pode ser algo na logica mesmo… apesar de eu ter ctza q o objetoi ta carregado na session…

edit…
entao… vi aqui… o meu properties q ta mudando isso…
userProductList.add.ok = userProductList.list.logic
entao acredito q esteja certo…

Lucas_Cavalcanti

hum… então por algum motivo o userProductList.list.logic não está funcionando com o c:import…

como está o código do userProductList.list.logic?

T

em branco… o list esta declarado assim :

public void list() {
}

como a apostila falou… eu tbem achei ele estranho… pensei em mudalo… colocar um retorno…mas ainda estou meio perdido em como as coisas funcionam no vraptor…
tentei chamar esse metodo list no onload da pagina… mas tbem nao deu certo…
tentei colocar um outro metodo add com a assinatura diefrente, chamndo ele no onload sem passra product nenhum, mas ai alem de nao ter dado certo, ele comecou a ser chamado mesmoq aundo eu passava um produto… how wierd is that? hehehe

Lucas_Cavalcanti

vc sabe que todo esse trabalho que vc teve não seria necessário com o VRaptor 3, né? :wink:

T

c vc me falar assim :"cara… se vc começar nesse exato minuto, vc consegue migrar o seu VRaptor 2.5 inteiro pro 3… e vai dormir hj sorrindo…"
Eu mudo… lol
Tenho q entregar isso essa semana… e ainda falta muito embelezamento… ta foda…
Fora esse bug, ainda tem outros… mas é foda ficar trabalhando com coisa desatualizada mesmo…

Lucas_Cavalcanti

se vc seguir isso: http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/

tudo o que já está pronto do vr2 ainda vai continuar funcionando no 3… e vc pode ir migrando essas partes que estão com problemas aos poucos

T

vo comecar a fazer (logo depois do futebol, logico… hahahha)
masi tarde posto ai oq deu certo e oq deu errado…

mas po… vcs da caelum pensam em tudo… ja montaram o esqueminha da migracao…
hahaha
Abraco

T

Pessoal… to com uma duvida… como q eu retorno uma msg de erro do nivel da logic pra view?
meu caso é o seguinte… na hora de salvar um objeto, estou verificanbdo se ja existe um com o mesmo nome no banco… dai se nao existir, o hibernate faz as verificacoes dele (se o nome é empty… se os campos devidos sao numericos…)
A view do vraptor esta pegando as msgs de erro com aquele codigo :

<ul id="errors">
		<c:forEach var="error" items="${errors.iterator}">
			<li>${error.key}</li>
		</c:forEach>
	</ul>

ai quewria mandar minha propria msg pra view a partir da logico informando por ex q a verificacaqo extra q eu fiz de nome foi mal sucedida…

tem como?

Abraço

G

O ideal é que você nos diga como é feito essa validação, assim podemos entender como tratar essas mensagens. Mas te passo o meu caso, talvez possa ajudá-lo.

Meu projeto é composto de vraptor3 como controlador, todas as chamadas de negócio são feitos em uma camada EJB remota, que valida os dados recebidos, trata a regra de negócio e tudo mais. Caso você tente incluir um usuário que já exista o EJB lança uma exception assim:

public void store(User user) { [...] throw new ServiceException("Usuário já existe"); }

No seu controller você precisa tratar essa mensagem ± assim:

public void foo(User user) { try { userService.store(user); } catch (ServiceException e) { validator.add(new ValidationMessage(e.getMessage(), "error")); } }

Eu propus um exception handler no vraptor, e logo que sair o exception-handler você não precisará mais fazer try-and-catch, o próprio vraptor cuidará de tratar isso para você.

Abraços

Criado 16 de novembro de 2009
Ultima resposta 13 de dez. de 2009
Respostas 43
Participantes 3