[Resolvido] Metódos http com vraptor

31 respostas
P

Olá!

Li sobre Http methods com vraptor http://vraptor.caelum.com.br/documentacao/resources-rest/, mas fiquei em dúvida, como identificar o tipo de metódo q esta chamando meu controller.

tenho o metódo:

@Get
	@Post
	@Path("/confirmacao")
	public void confirmacao(){
		
	}

e eu gostaria de tratar diferentemente as solicitações, algo do tipo:

@Get
	@Post
	@Path("/confirmacao")
	public void confirmacao(){

if(webMethod().equals("post)){
tratar post;
}else{
tratar get;
}

alguém tem alguma idéia??

att,

31 Respostas

G

O mais elegante é você ter métodos distintos para GET e POST.

Seu codigo ficaria assim:

@Get @Path("/confirmacao")
public void confirmacaoGet(){
    // faz alguma coisa
}

@Post @Path("/confirmacao")
public void confirmacaoPost(){
    // faz outra coisa
}
P

opa garcia-jj,

obrigado deu 100% certo aqui!

só mais uma dúvida, supondo q a chamada seja feita via POST, eu consigo resgatar valores desse request?

por exemplo com servlets seria algo do tipo:

HttpServletRequest request;

request.getAttributeNames();

Obrigado!

att,

L

essa página explica:
http://vraptor.caelum.com.br/documentacao/resources-rest/

na seção “Parâmetros dos métodos”

se vc vai passar parâmetros simples, dá pra receber direto. Por exemplo o parâmetro teste=abc

public void logica(String teste) {

}
P

Super Lucas!

valeu!

eu pulei com 100% de precisão a seção “Parâmetros dos métodos”.

…agora complicou um pouco.
eu preciso receber quase 30 parâmetros, p/ instanciar 1 Objeto.

Eu tenho os gets e sets normal desse Objeto, os atributos tem o mesmo nome dos parâmetros e o envio desse post é realizado por um outro sistema.
Desculpa a falta de conhecimento, mas se eu fizer isso

public void logica(Objeto objeto) {  

objeto.getNome();

}

será q magicamente ele seria instanciado com os valores dos parâmetros???

Muito Obrigado!

att,

L

sim, se tiver os getters e setters apropriados, o objeto vem populado magicamente com os valores que vc passou

P

SHOW DE BOLA!!!

melhor do q isso só se já estivesse tudo programado hehehe

Muito obrigado Lucas!(de novo! rs)

Obrigado também pela ajuda garcia-jj!

att,

J

É essa duvida que eu tenho, se eu tiver um cadastro de clientes, por exemplo, tenho que ter um método

@Post
@Path("/cliente/novo")
public void novo(Cliente c) {}

ou

@Post
@Path("/cliente/novo")
public void novo(String nome, String endereco, /*outros parametros*/) {}

?

Caso eu preciso apenas do objeto Cliente, como eu faria com jQuery, por exemplo?
Passaria os parametros nome e endereco na função

$.post(url, {nome, endereco});

?

L

no caso de novo(Cliente c) vc faria:

$.post(url, {'c.nome': nome, 'c.endereco': endereco});

desde que existam os setters respectivos.

A

Uma duvida!
não consigo passar o parametro para meu metodo através da url

e no meu metodo esta assim

@Post @Path(value="/download") public InputStreamDownload download(XmlNfePojoImpl xmlSt) {...}

o problema maior é que não consigo acessar os parametros?

L

vc precisa dar um nome pro parâmetro, de acordo com o parametro do método… algo do tipo:

..../download?xmlSt.numNfe=${xml.numNfe}
A

de um dos sites que pesquisei achei esse trecho de código

porem assim ou da forma que sitei anterior ele nem mesmo entra no método
é como se ele não entendesse o parametro

A

dentro do metodo no meu controller os parametros ficam vazios não consigo recuperar o valor dentro do controller

esse é meu unico problema.

nas mesma tela eu tenho um formulário
e os campos do formulário eu consigo enviar para o controller porém o parametro do método não consigo enviar nem da forma que esta na documentação do VRaptor e nem das formas que citei aqui no forum
se alguem puder me ajudar agradeço muito .

L

vamos lá:

@Post  
        @Path(value="/download")  
        public InputStreamDownload download(XmlNfePojoImpl xmlSt) {...}

o cara tá como @Post, então ele não vai funcionar num link. Vc precisa mudar pra @Get.

pra ele aceitar o parâmetro xmlSt.numNfe, a classe XmlNfePojoImpl precisa ter o método setNumNfe(…)

A

Infelizmente seguindo as recomendações os valores dentro do controller estão vazios

deixa perguntar é necessário criar uma classe XMLLogic por exemplo contendo apenas esse objeto ou uma Interceptor só para tratar isso?

L

o parâmetro do método download (xmlSt) tá vindo null?

o método tá como @Get? o método é invocado?

A
sim para as tres perguntas
@Path("/download")
	@Get
	public InputStreamDownload download(XmlNfePojoImpl xmlSt) {
             String numeroNota = xmlSt.getNumNfe() // aqui ele é nulo
        }
e na pagina ele esta assim
<display:table  cellspacing="0" cellpadding="0"
						name="${usuarioSession.lista}" id="xmlSt" class="food_planner">

						<display:column property="chaveNfe" title="Chave da Nota" />
						<display:column property="numNfe" title="Numero Nota Fiscal" />
						<display:column property="cnpjCliente" title="Cnpj" />

						<display:column title="Download" ><a class="btn-nfe" href="${pageContext.request.contextPath}/download?xmlSt.numNfe=${xmlSt.numNfe}">Baixar NFe</a></display:column>

						
					</display:table>
L

faz o seguinte… com o browser aberto nessa página, abra o código fonte dela e veja qual é a url que ele está colocando no <a class=“btn-nfe”…

está com o numNfe preenchido?

de novo: XmlNfePojoImpl tem o método setNumNfe()?

A

sim possui,
é um pojo padrão com getters e setters comuns
não é?

L

blz, e o código fonte da página no browser, como tá?

A

naquele ponto exatamente esta assim

L

então não faz sentido estar null… faz o seguinte, habilite o log de debug do vraptor.
(https://github.com/caelum/vraptor/blob/master/vraptor-blank-project/src/log4j.xml trocando o INFO pra DEBUG na category do vraptor)

faça a requisição do download e poste aqui o log que aparecer no servidor.

de preferencia só o log da requisição.

A

Habilitei ele preciso copiar para vc o resultado do console?

A

A pergunta foi porque nenhuma informação apareceu no console

L

vc copiou esse arquivo pro classpath? ele aparece alguma informação de log no console?

A

copiei,
ele não carrega nenhuma informações sobre o VRaptor no console apenas as que ja estavam carregando
do JMS e do servidor de aplicação

só para informar a versão do VRaptor é a 3

e meu Server App é o Jboss 7.1AS

L

aparece isso no console?

log4j:WARN No appenders could be found for logger

se sim, vc não colocou o log4j.xml na pasta certa… ele precisa estar no classpath (geralmente se vc colocar na pasta src ou src/main/resources)

A

pois é ele esta neste diretório mesmo

DownloadNFeWeb\src\log4j.xml

nesse caso dentro do meu Src isso porque no meu projeto em nenhuma momento mostra a pasta main

L

vc tá no eclipse? se sim, src é uma source folder?

A

sim para as duas perguntas

achei estranho pelo seguinte
na documentação

se eu passar para o metodo

ele atribuirá o valor ao método.

@Get public void metodo(String mensagem){...}

mas eu testei aqui e também não funciona.

L

“/xml/metodo/mensagem” não é um método, é uma URI.

o VRaptor popula os parametros de acordo com os nomes dos parametros das requisições.

@Get("/abc/def")
public void metodo(String mensagem) {

}

pra chamar esse método vc usa a url …/abc/def e pra passar o parametro vc tem que mandar na requisição um parametro chamado mensagem.

tudo isso tá na doc: http://vraptor.caelum.com.br/documentacao/

A

Consegui resolver
muito obrigado pela ajuda

o parametro é Inteiro acho que isso estava dando algum problema porque eu alterei ele para String e funcionou

Criado 14 de fevereiro de 2011
Ultima resposta 14 de jun. de 2012
Respostas 31
Participantes 5