VRaptor: serializar toString() dos objetos no JSON?

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 :slight_smile:

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