VRaptor / Restfulie - Serializee null

VRaptor: 3.4.1

Será que alguém consegue me ajudar com as seguintes questões:

  1. Para receber deserializar dados recebidos como post posso usar isso aqui?
    @Post
    @Path("/service/xxxx")
    @Consumes
    public void doSomething(Dado dado) {
        ...
    }

O dado é postado como JSON

  1. Quase tudo funciona bem… exceto que eu tomo um NPE

O serializee na linha 03 é null!!!

public class VRaptorClassMapper extends MapperWrapper {
...
	@Override
	public boolean shouldSerializeMember(Class definedIn, String fieldName) {
		for (Entry<String, Class><?>> include : serializee.getIncludes().entries()) { <------- o serializee é null!!!
			if (isCompatiblePath(include, definedIn, fieldName)) {
				return true;
			}
		}

bizarro chamar o shouldSerializeMember na deserialização…

vc tá mandando o json com root? tipo {“dado”: {…}}

Po Lucas, não tinha nem me dado conta… verdade, né… bem bizarro.

Então, tente com e sem root, ambos deram o mesmo problema… e se em debug eu inicializo o serializee com new Serializee() rola tudo direitinho.

vc consegue isolar esse problema?

abre uma issue, por favor:

melhor ainda se vc quiser mandar um pull request e contribuir com o VRaptor =)

Segunda feira vou dar mais uma olhada, se eu encontrar uma solução que parecer consistente eu mando um pull request.

Finalmente pude voltar à esse problema, e resolvi antes de mais nada validar alguns pontos básicos:

  1. versões:

vraptor 3.4.1
restfulie 1.0.1

  1. configuração do (de)serializer:
@Component
@PrototypeScoped
public class CustomXStreamBuilder extends XStreamBuilderImpl {

    public CustomXStreamBuilder(XStreamConverters converters, TypeNameExtractor extractor) {
        super(converters, extractor);
    }


    @Override
    public XStream configure(XStream xstream) {
        XStream instance = super.configure(xstream);
        instance.processAnnotations(Dado.class);
        return instance;
    }
}

é isso mesmo que deveria ser feito?

teoricamente sim, isso funcionou?

Não, não funcionou, deu o NPE descrito acima…

acabei de compilar uma versao custom do VRaptor 2.4.1 que inicializa o serializee com new Serializee() na declaração, pelos meus testes em debug, deve resolver… só que não consegui entender o problema, está me parecendo uma correção meio gambiarra

tenta fazer o seguinte:

VRaptorClassMapper mapper = (VRaptorClassMapper) xstream.getMapper();

mapper.setSerializee(new Serializee())

se isso funcionar a gente corrige no vraptor de verdade

Não entendi, onde é para fazer isso? de onde devo pegar o xstream?

Lucas,

alterando o CustomXStreamBuilder para isso aqui, funcionou:

@Component
@PrototypeScoped
public class CustomXStreamBuilder extends XStreamBuilderImpl {

    public CustomXStreamBuilder(XStreamConverters converters, TypeNameExtractor extractor) {
        super(converters, extractor);
    }


    @Override
    public XStream configure(XStream xstream) {
        XStream instance = super.configure(xstream);
        instance.processAnnotations(Dado.class);

        VRaptorClassMapper mapper = ((VRaptorXStream) instance).getVRaptorMapper();
        mapper.setSerializee(new Serializee());
        return instance;
    }

legal!

faz um pull request lah pro VRaptor, por favor?


começar com o serializee como new Serializee()

ou pelo menos abre uma issue?

mandei o pull request

Aceito, valeu!