Lucas_Cavalcanti 16 de mar. de 2011
vc pode retornar uma lista de Strings, (ou uma lista de qqer outra coisa)
e fazer:
result.use(json()).from(lista, "nomeDela").serialize();
e vc acessa via javascript como json
vasilvei 16 de mar. de 2011
Fiz exemplo utilizando cidade, ele chama o metodo do dao, e faz a consulta e tal, só que não retorna nada, acho que estou esquecendo de algo, ou não estou fazendo certo, poderia dar uma olhada e ver o que estou errando fazendo o favor.
Cidadecontroller
@Get
@Restrito
@Path ( "/buscaCidade/busca" )
public void buscaCidade ( String idcidade ) {
result . use ( Results . json ()). from ( dao . getCidades ( idcidade ), "Resultado" ). serialize ();
}
javascript
function getCidade() {
$.get("/Coliseu/buscaCidade/busca?idcidade="+$("#idcidade").val(), function(){
$("#cidadenome").val(Resultado["cidade.cidade"]);
$("#uf").val(Resultado["cidade.uf.siglauf"]);
});
}
CidadeDao
public List < Cidade > getCidades ( String idcidade ) {
Session session = Hibernate .getSession () ;
List < Cidade > list = null ;
Criteria criteria = null ;
try {
criteria = session .createCriteria ( Cidade .class ) .add ( Restrictions .eq ( "idcidade" , idcidade )) ;
criteria .uniqueResult () ;
list = criteria .list () ;
if ( criteria .uniqueResult () == null ) {
list = null ;
}
} catch ( HibernateException hibernateException ) {
list = null ;
}finally {
session .close () ;
}
return list ;
}
Lucas_Cavalcanti 16 de mar. de 2011
no javascript, vc tem que receber o que o controller retornou. Vc pode usar o $.getJSON:
$.getJSON("/Coliseu/buscaCidade/busca", {idcidade : $("#idcidade").val()}, function(json){
$("#cidadenome").val(json.Resultado.cidade.cidade);
$("#uf").val(json.Resultado.cidade.uf.siglauf);
});
ou algo do tipo
vasilvei 16 de mar. de 2011
cara não deu certo ele dá essa mensagem no navegador (Uncaught TypeError: Cannot read property ‘cidade’ of undefined)
$.getJSON("/Coliseu/buscaCidade/busca", {idcidade : $("#idcidade").val()}, function(json){
$("#cidadenome").val(json.listcidade.cidade.cidade);
$("#siglauf").val(json.listcidade.cidade.uf.siglauf);
});
}
@Get
@Restrito
@Path ( "/buscaCidade/busca" )
public void buscaCidade ( String idcidade ) {
result . use ( Results . json ()). from ( dao . getCidades ( idcidade ), "listcidade" ). serialize ();
}
Lucas_Cavalcanti 16 de mar. de 2011
dê um console.dir(json) e veja o que aparece (no Firebug)
vasilvei 16 de mar. de 2011
no console do chrome aparece o seguinte:
Uncaught TypeError: Cannot read property 'cidade' of undefined
(anonymous function)funcoes.js:302
bjquery.js:2642
c.extend.ajax.g.x.onreadystatechange
Lucas_Cavalcanti 16 de mar. de 2011
chama a uri: “/Coliseu/buscaCidade/busca?idcidade=111” na mão e vê qual é a resposta
vasilvei 16 de mar. de 2011
eu passei isso
http://localhost:8084/Coliseu/buscaCidade/busca?idcidade=1100015
e retornou isso
{"listcidade": [
{
"idcidade": "1100015",
"cidade": "Alta Floresta D'Oeste"
}
]}
Lucas_Cavalcanti 16 de mar. de 2011
vc queria que retornasse mais de uma cidade mesmo?
o problema é que json.listcidade é um array…
então vc deveria fazer algo do tipo:
json.listcidade[0].cidade
para acessar o dado correto.
vasilvei 16 de mar. de 2011
Eu quero que ele retorne somente uma cidade, tipo eu quero o seguinte tem 3 campos, o idcidade, cidade e a uf, se o usuário souber o idcidade, ele informa, e através do json, faz a consulta e retorna a cidade, e a uf, caso não encotre vai retornar no cidade, não encontrado.
Lucas_Cavalcanti 16 de mar. de 2011
ok, então vc não deveria serializar uma lista, e sim um objeto que tenha como atributos o nome da cidade e o uf. e vc pode usar o withoutRoot:
Cidade cidade = carregaACidade ( idcidade );
result . use ( json ()). withoutRoot (). from ( cidade ). serialize ();
e no javascript:
$.getJSON(...., function(cidade) {
cidade.cidade
cidade.uf
})
vasilvei 16 de mar. de 2011
Deu certo, só que eu tenho a tabela cidade, e uf, ele trás o nome da cidade mas não a uf, o que eu preciso fazer para retornar a uf também:
function getCidade() {
$.getJSON("/Coliseu/buscaCidade/busca", {idcidade : $("#idcidade").val()}, function(cidade){
$("#cidadenome").val(cidade.cidade);
$("#siglauf").val(cidade.cidade.uf.siglauf);
});
}
CidadeController
@Get
@Restrito
@Path ( "/buscaCidade/busca" )
public void buscaCidade ( String idcidade ) {
Cidade cidade = dao . getCidades ( idcidade );
result . use ( Results . json ()). withoutRoot (). from ( cidade ). serialize ();
}
CidadeDao
public Cidade getCidades ( String idcidade ) {
Session session = Hibernate .getSession () ;
Criteria criteria = null ;
Cidade cidade = new Cidade () ;
try {
criteria = session .createCriteria ( Cidade .class ) .setFetchMode ( "uf" , FetchMode .JOIN ) .add ( Restrictions .eq ( "idcidade" , idcidade )) ;
if ( criteria .uniqueResult () == null ) {
criteria = null ;
}
cidade = ( Cidade ) criteria .uniqueResult () ;
} catch ( HibernateException hibernateException ) {
criteria = null ;
}finally {
session .close () ;
}
return cidade ;
}
Lucas_Cavalcanti 16 de mar. de 2011
adicione um recursive():
result.use(Results.json()).withoutRoot().from(cidade).recursive().serialize();
por padrão o VRaptor só serializa os tipos primitivos (strings, numeros e datas), daí os outros campos precisam ser incluidos via include ou recursive pra incluir tudo
vasilvei 16 de mar. de 2011
Agora ele não retorna nada no campo do formulário, e quando faço na mão: http://localhost:8084/Coliseu/buscaCidade/busca?idcidade=1100015 retorna :
{
"uf" : {
"uf" : "11" ,
"nomeuf" : "Rondônia" ,
"paissigla" : "BR" ,
"siglauf" : "RO" ,
"tribestadosCollection" : [
false ,
{
"@class" : "uf"
a unica mudança que fiz foi essa:
@Get
@Restrito
@Path ( "/buscaCidade/busca" )
public void buscaCidade ( String idcidade ) {
Cidade cidade = dao . getCidades ( idcidade );
result . use ( Results . json ()). withoutRoot (). from ( cidade ). recursive (). serialize ();
}
Lucas_Cavalcanti 16 de mar. de 2011
não bom, faça isso então:
result .use ( Results .json ()) .withoutRoot () .from ( cidade ) .include ( "uf" ) .serialize () ;
por isso q eu não gosto de usar recursive
vasilvei 17 de mar. de 2011
Deu certo Lucas, muito obrigado você já me ajudou um várias vezes valew mesmo.
segue como fincou:
Controller
@Get
@Restrito
@Path ( "/buscaCidade/busca" )
public void buscaCidade ( String idcidade ) {
Cidade cidade = dao . getCidades ( idcidade );
result . use ( Results . json ()). withoutRoot (). from ( cidade ). include ( "uf" ). serialize ();
}
javascript
function getCidade() {
$.getJSON("/Coliseu/buscaCidade/busca", {idcidade : $("#idcidade").val()}, function(cidade){
$("#cidadenome").val(cidade.cidade);
$("#siglauf").val(cidade.uf.siglauf);
});
}