Como o VRaptor sabe que deve qual classe e método chamar quando usando a annotation @Consumes?
olá,
@Resource
public class MeuController {
@Consumes
public void meuMetodo(MinhaClasse classe) {
}
}
vai chamar meuController.meuMetodo() passando uma instancia de minhaClasse que foi deserializada com a request…
A dúvida é como ele sabe qual deserializer usar. Por exemplo, se eu quiser implementar uma deserializer para Json, como o vraptor vai saber que vai usar o deserializer que eu criei?
é pelo header content-type…
por padrão o VRaptor sabe deserializar application/xml ou text/xml.
vc pode criar o seu próprio, só anotando seu deserializer com:
@Deserializes({"um.content/type", "outro/content+type"})
mas o header Content-type precisa estar setado no post que vc manda pro servidor
Se eu criar a interface:
[code]package br.com.caelum.vraptor.deserialization;
@Deserializes({“application/json”,“json”, “text/json”})
public interface JSONDeserializer extends Deserializer {
}
[/code]
E a classe :
package br.com.caelum.vraptor.deserialization;
import java.io.InputStream;
import br.com.caelum.vraptor.resource.ResourceMethod;
public class XStreamJSONDeserializer implements JSONDeserializer {
public Object[] deserialize(InputStream inputStream, ResourceMethod method) {
/* Implementação */
return null;
}
}
Quando eu enviar um json, o raptor vai entender que deve usar o XStreamJSONDeserializer e passar o Objeto extraído do json para parâmetro? Ex:
@Consumes
public void criar(Cliente cliente)
{
...
}
Eu vi que existe uma implementação para deserializer json’s: br.com.caelum.vraptor.deserialization.JsonDeserializer.
Essa classe não funciona?
a do VRaptor funciona sim =) ou pelo menos deveria…
vc pode criar uma interface, mas vc precisa anotar a implementação com @Deserializes
eu me enganei…
ele não (de)serializa os links (hypermedia) do json automaticamente, mas no @Consumes ele faz isso sim
Por que a classe JsonDeserializer não é um interface? E por que não existe a class XStreamJSONDeserializer que seria a implementação de JsonDeserializer ? Achei estranho não ter sequido o mesmo padrão que o XML usa.
era uma feature beta que acabou ficando… ainda da tempo de refatorar, na próxima major release
abre uma issue pra isso por favor?
se puder fazer um fork, implementar e mandar um pull request também ficaremos bastante agradecidos =)
Hummmm. Deixa comigo!
Daqui pro fds eu envio o Pull Request!
Sou fã do vraptor e quero contribuir.
=D
Hey, eu preciso clonar apenas o branch master?
isso, clone o master, crie um branch a partir dele e mande um pull request desse branch
Lucas, fiz o clone. Não alterei nada e executel o script do ant para fazer para testar e compilar só que ele apresentou erros. É assim mesmo? O branch master possui testes que falham?
o ant talvez esteja um pouco desatualizado…
se vc tiver o maven instalado, tenta mvn test (precisa rodar o maven_fix.sh antes)