VRaptor: 3.4.1
Será que alguém consegue me ajudar com as seguintes questões:
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
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:
versões:
vraptor 3.4.1
restfulie 1.0.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?
/***
* Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package br.com.caelum.vraptor.serialization.xstream;
import java.util.Calendar;
This file has been truncated. show original
começar com o serializee como new Serializee()
ou pelo menos abre uma issue?