VRaptor: serializar toString() dos objetos no JSON?
11 respostas
BeowulfBjornson
Em suma, tem como?
Eu tentei criar um faux-getter retornando o toString(), mas disparou uma exceção que o atributo não existe. Eu poderia usar um @Transient e atualizar ele sempre que os atributos necessários forem alterados, mas não vou muito com a cara dessa solução.
Escrever um Converter imagino que resolveria esse problema, mas envolveria uma bela refatoração, que estava tentando evitar.
Caused by: java.lang.NullPointerException
at br.com.caelum.vraptor.serialization.xstream.VRaptorClassMapper.shouldSerializeMember(VRaptorClassMapper.java:55)
at com.thoughtworks.xstream.converters.javabean.JavaBeanConverter$1.shouldVisit(JavaBeanConverter.java:78)
at com.thoughtworks.xstream.converters.javabean.BeanProvider.visitSerializableProperties(BeanProvider.java:77)
at com.thoughtworks.xstream.converters.javabean.JavaBeanConverter.marshal(JavaBeanConverter.java:76)
at br.com.teste.MyBeanConverter.marshal(MyBeanConverter.java:29)
Estou serializando da seguinte forma:
Lucas_Cavalcanti
vc criou um VRaptorClassMapper, certo?
tente extrair pra uma variável e fazer:
mapper.setSerializee(new Serializee());
BeowulfBjornson
Aye, estou usando o VRaptorClassMapper, mas o problema de extrair para uma váriavel é que eu teria que fazer isso no construtor (já que ele recebe o TypeNameExtractor) e teria que ser antes de eu chamar o super(mapper), o que não dá para fazer porque a chamada para o construtor da superclasse precisa ser a primeira coisa no construtor.
Ou tem alguma outra maneira de fazer isso?
public MyBeanConverter(TypeNameExtractor extractor) { //Error: Implicit super constructor JavaBeanConverter() is undefined. Must explicitly invoke another constructor
VRaptorClassMapper mapper = new VRaptorClassMapper(new XStream().getMapper(), Suppliers.ofInstance(extractor));
mapper.setSerializee(new Serializee());
super(mapper); //Error: Constructor call must be the first statement in a constructor
}
Lucas_Cavalcanti
tenta extrair isso pra um método:
public MyBeanConverter(TypeNameExtractor extractor) {
super(createMapper(extractor));
}
BeowulfBjornson
Lucas Cavalcanti:
tenta extrair isso pra um método:
public MyBeanConverter(TypeNameExtractor extractor) {
super(createMapper(extractor));
}
Ah, the hacks we do
Com isso eu consegui resolver, o único porém é que não dá para incluir só o que eu quero no Result, mas isso é o de menos. Valeu mesmo, Lucas! (Y)
Lucas_Cavalcanti
você até consegue fazer isso mudando o serializee, mas acho que não vai conseguir fazer isso on demand