GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

VRaptor / Restfulie - Serializee null


#1

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

2) 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;
			}
		}

#2

bizarro chamar o shouldSerializeMember na deserialização...

vc tá mandando o json com root? tipo {"dado": {....}}


#3

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.


#4

vc consegue isolar esse problema?

abre uma issue, por favor:
https://github.com/caelum/vraptor/issues

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


#5

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


#6

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?


#7

teoricamente sim, isso funcionou?


#8

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


#9

tenta fazer o seguinte:

VRaptorClassMapper mapper = (VRaptorClassMapper) xstream.getMapper();
mapper.setSerializee(new Serializee())

se isso funcionar a gente corrige no vraptor de verdade


#10

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


#11

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;
    }

#12

legal!

faz um pull request lah pro VRaptor, por favor?
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/xstream/VRaptorClassMapper.java
começar com o serializee como new Serializee()

ou pelo menos abre uma issue?


#13

mandei o pull request


#14

Aceito, valeu!


#15