Dúvida sobre @Consumes

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

Bem. nesse post aqui, você disse que ele não deserializa json por padrão, só xml.

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 :wink:

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! :slight_smile:
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)