Problema com VRaptor 3.4.0 + Backbone ao receber os parâmetros

Boa tarde pessoal.

Sou novato no VRaptor e estou tentando implementar um sistema REST com ele. Tenho um front em Backbone.

Quando faço um ajax normal:

$.ajax({
                type: "post",
                url: painel.apiUrl + "/login",
                data: {'usuario.login': 125, 'usuario.senha': "Joaozinho"},
                dataType: "json",
                success: function(data) {
                    alert("Sucesso!");
                },
                error: function() {
                    alert("Erro!");
                }
            });

O VRaptor consegue injetar os parâmetros normalmente (imagens abaixo):

Agora, quando faço um save no Backbone, ele manda um REQUEST PAYLOAD, e o VRaptor não consegue mais injetar:

Tentei usar o @Consumes(“application/json”) mas não resolveu. Alguém pode me dar um help nisso?

é que ele tá passando um json… se vc quiser o consumes, o json tem que ser:

{ "usuario": { "login": "xxx", "senha": "yyy" } }

Lucas, obrigado por responder.

Tentei assim, como disse…mas deu um erro que até agora não consegui “decifrar”:

com.thoughtworks.xstream.mapper.CannotResolveClassException: usuario.login

meu código ficou assim:

 @Post("/login")
    @Consumes
    public void login(AdminUsuario usuario) {

Obrigado pela atenção

como é o json que vc está mandando?

Lucas, obrigado pela resposta.

Eu tinha enviado o mesmo exemplo que você postou. O que acontece é que o backbone adiciona os campos DEFAULTS…então, além dele, estava indo os defaults usuario e senha.

Resolvi tirando os defaults. Obrigado

Te falei que o problema era o backbone! muahahaha

Desculpa “reabrir” esse post. Mas estou com muita dificuldade pra manipular o JSON no Vraptor.

Tenho esse JSON sendo enviado por ajax:

{
    "indicadorMeta": {
        "desc_meta": "meta de teste",
        "indindi_id": "16",
        "numr_ano": "2014"
    },
    "indicadorMetaValorList": [
        {
            "numr_ordem": "1",
            "numr_valor": "1200"
        }
    ]
}

Meu método é assim:

@Post("/meta")
@Consumes
public void inserir(IndicadorMeta indicadorMeta, List<IndicadorMetaValor> indicadorMetaValorList) {

sendo que no IndicadorMeta tem os campos desc_meta, indindi_id e numr_ano e no IndicadorMetaValor tem os campos numr_ordem e numr_valor. O indicadorMeta chega preenchido, mas o indicadorMetaValorList não. Aonde errei?

isso só é suportado pelo GSon, e na última versão do VRaptor (talvez no snapshot da 3.5.2)

Você pode atualizar o VRaptor?

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.5.2-SNAPSHOT/vraptor-3.5.2-20130709.125703-4.jar

e registrar os pacotes de deserialização do gson, no parametro packages do web.xml:

<context-param>
   <param-name>br.com.caelum.vraptor.packages</param-name>
   <param-value>...., br.com.caelum.vraptor.deserialization.gson</param-value>
</context-param>

ela não ta no repo do maven ainda né?

coloquei a 3.5.1…aproveitei que o projeto ta pequeno e mudei do spring para o google guice…

Para chegar no problema citado acima, passo por outras telas, que agora deu problema depois da alteração…rsrs…

A Verdade é que, ao consultar um GET (uma lista), ele está me retornando diferente.

O meu ambiente é o RESTful com VRaptor mas sem nenhum jsp. Eu queria muito retornar um JSON assim: mas não consegui

{
    "total_entries":17,
    "data":[
        {
            "id":"899",
            "codg_tipo":"123",
            "desc_tipo":"qweweq",
            "desc_mascara":""
        }
    ]
}

eu tentei assim:

Retorno retorno = new Retorno();
retorno.setData(indicadorDao.findAllByAttributes(indicador));
retorno.setTotalEntries(indicadorDao.getCount(indicador));
result.use(Results.json()).from(retorno).serialize();

Fiz esse Retorno só para tentar fazer isso…Depois que mudei para a 3.5.1 ele tá me retornando assim agora:

{
    object-array: [
        {
            total_entries: 26
        }
    ]
}

como consigo fazer do jeito mencionado?

a serialização da classe Retorno ficou assim? bem estranho heim

ou vc mandou serializar direto a lista?

Lucas, desculpa!

O object-array foi erro meu. Mas consegui resolver colocando o .recursive()…me retornou exatamente como eu queria!

Voltando ao outro erro, continuou trazendo a lista vazia, meu json enviado:

{
    "indicadorMeta":{
        "desc_meta":"nome teste",
        "indindi_id":"15","numr_ano":"2013"
    },
    "indicadorMetaValorList":[
        {
            "numr_valor":"10",
            "numr_ordem":"1"
        },
        {
            "numr_valor":"20",
            "numr_ordem":"2"
        }
    ]
}

Meu método:

@Post("/meta")
@Consumes
public void inserir(IndicadorMeta indicadorMeta, List<IndicadorMetaValor> indicadorMetaValorList) {

o indicadorMetaValorList continua vazio. É necessário o vraptor 3.5.2 ou o vraptor 3.5.1 era pra funcionar?

coloquei assim no web.xml:

    <context-param>  
        <param-name>br.com.caelum.vraptor.packages</param-name>  
        <param-value>br.com.caelum.vraptor.deserialization.gson</param-value>  
    </context-param> 

acho que só funciona no 3.5.2 =(

adicione o repositório de snapshot:
http://oss.sonatype.org/content/repositories/snapshots

e mude a versão do VRaptor pra 3.5.2-SNAPSHOT

Feraaaaaa!!

Valeu…só tive que adicionar {“indicadorMetaValor”: para cada objeto da lista, mas já funcionou!!

Obrigado