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.
Alguma sugestão?
o xstream por padrão não usa os getters, ele usa o atributo direto…
vc quer que a serialização seja só o toString() ou vc quer que além dos atributos exista um com o toString?
O toString() teria que ir junto. Ou pelo menos ir ele e o id.
Então o jeito melhor seria com um converter sim… crie essa classe (vraptor 3.4.1)
@Component
public class MeuBeanConverter extends JavaBeanConverter {
public boolean canConvert(Class type) {
return SuaClasse.class.isAssignableFrom(type);
}
}
se ele pedir pra sobrescrever o construtor, crie um construtor que nem o dessa classe:
http://www.guj.com.br/java/254764-resolvido-duvida-sobre-validator-extjs-4--json--vraptor-340/5#1427839
ah, com o converter acima ele vai usar os getters ao invés do acesso direto ao atributo…
Beleza, vou dar uma olhada e aviso com o resultado.
Implementando o Converter foi de boa, aí meu faux-getter no JSP fez o trabalho.
Porém pro JSON ainda não resolveu. Meu mashal() ficou assim:
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
super.marshal(source, writer, context);
writer.startNode("nomeComSituacao");
writer.setValue(source.toString());
writer.endNode();
}
Eu recebo direto a seguinte exceção:
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:
vc criou um VRaptorClassMapper, certo?
tente extrair pra uma variável e fazer:
mapper.setSerializee(new Serializee());
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
}
tenta extrair isso pra um método:
public MyBeanConverter(TypeNameExtractor extractor) {
super(createMapper(extractor));
}
[quote=Lucas Cavalcanti]tenta extrair isso pra um método:
public MyBeanConverter(TypeNameExtractor extractor) {
super(createMapper(extractor));
}
[/quote]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)
você até consegue fazer isso mudando o serializee, mas acho que não vai conseguir fazer isso on demand