Pessoal,
Este tópico, http://www.guj.com.br/java/219161-vraptor-3-serialize-enum-json, fala exatamente o que estou precisando.
Mas como já tem tempo, gostaria de saber se há outra(nova) forma de fazer essa conversão. Se não o que eu coloco no new SeuEnumConverter().
Preciso pegar este enum:
public enum FormaPagamentoNotaFiscalEmunerator {
AVISTA("0 - A Vista", 0),
APRAZO("1 - A Prazo", 1),
OUTROS("2 - Outros", 2);
private final String nome;
private final int valor;
FormaPagamentoNotaFiscalEmunerator(String nome, int valor){
this.nome = nome;
this.valor = valor;
}
public String getNome() {
return nome;
}
public int getValor() {
return valor;
}
}
E retornar o Json abaixo:
Desde já, obrigado pela atenção.

escreva um converter do XStream pra isso… algo como:
@Component
public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter { //do XStream
//canConvert vc retorna true se for o seu enum
//unmarshall pode deixar em branco
//marshal, vc pega o Object, faz o cast pro seu enum, e faz:
public void marshall(....) {
writer.startNode("valor");
writer.setValue(meuEnum.getValor());
writer.endNode();
//mesma coisa pro nome.
}
}
Lucas, obrigado pela resposta.
Sinceramente, quando vi a resposta não entendi nada.
Comecei a pouco tempo com vraptor e gostei exatamente por ser bastante simples e intuitivo.
Fui atrás e tentei aprender um pouco sobre. Consegui ver alguns exemplos que tratava do mesmo problema, mas ainda não foi.
Ficou assim o converter:
public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter<FormaPagamentoNotaFiscalEmunerator> { //do XStream
//marshal, vc pega o Object, faz o cast pro seu enum, e faz:
public void marshall(Object meuEnum, HierarchicalStreamWriter writer, MarshallingContext context) {
writer.startNode("valor");
writer.setValue( Integer.toString( ((FormaPagamentoNotaFiscalEmunerator) meuEnum).getValor()) );
writer.endNode();
writer.startNode("nome");
writer.setValue(((FormaPagamentoNotaFiscalEmunerator) meuEnum).getNome());
writer.endNode();
//mesma coisa pro nome.
}
public boolean canConvert(Class type) {
return type.isEnum() && type.equals(FormaPagamentoNotaFiscalEmunerator.class);
}
public FormaPagamentoNotaFiscalEmunerator convert(String arg0,
Class<? extends FormaPagamentoNotaFiscalEmunerator> arg1,
ResourceBundle arg2) {
// TODO Auto-generated method stub
return null;
}
}
Estou tentando assim:
Mas ele continua retornando como antes:
Onde que foi errei? 
faltou o @Component em cima do converter =)
Lucas, eu tenho a anotação na classe, só não copiei aqui.
Tenho alguns converter, por exemplo para BigDecimal, com a anotação:
preciso dessa anotação para este converter?
Outra coisa, a classe fica dando erro de metodos não implementados, no caso o metodo convert, incluir o mesmo mas sem nenhum implementação.
Segue todo o código:
import java.util.ResourceBundle;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.ioc.Component;
import br.com.creati.smarterp.sistema.util.FormaPagamentoNotaFiscalEmunerator;
@Component
public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter<FormaPagamentoNotaFiscalEmunerator> { //do XStream
//marshal, vc pega o Object, faz o cast pro seu enum, e faz:
public void marshall(Object meuEnum, HierarchicalStreamWriter writer, MarshallingContext context) {
writer.startNode("valor");
writer.setValue( Integer.toString( ((FormaPagamentoNotaFiscalEmunerator) meuEnum).getValor()) );
writer.endNode();
writer.startNode("nome");
writer.setValue(((FormaPagamentoNotaFiscalEmunerator) meuEnum).getNome());
writer.endNode();
//mesma coisa pro nome.
}
public boolean canConvert(Class type) {
return type.isEnum() && type.equals(FormaPagamentoNotaFiscalEmunerator.class);
}
public FormaPagamentoNotaFiscalEmunerator convert(String arg0,
Class<? extends FormaPagamentoNotaFiscalEmunerator> arg1,
ResourceBundle arg2) {
// TODO Auto-generated method stub
return null;
}
}
O que está faltando? A forma que estou tentando serializar está correta?
Desde já obrigado.
vc tá usando o Converter do VRaptor, é pra usar o Converter do XStream, que tem esses 3 métodos que já estão na sua classe.
aparentemente é só isso que está errado.
Lucas, funcionou!
Mas um vez salvando nossas vidas, obrigado!
Resolveu meu problema. Cria o Xstream converter e anota ele com @Component.
@Component
public class EnumJsonSerialization implements Converter
{
@Override
public boolean canConvert(Class type) {
return type.isEnum();
}
@Override
public void marshal(Object enun, HierarchicalStreamWriter writer, MarshallingContext context)
{
for( Field field : enun.getClass().getDeclaredFields() )
{
if( ! field.isEnumConstant() )
{
String name = field.getName();
String getMethod = "get"+ name.substring(0,1).toUpperCase() + name.substring(1,name.length());
try {
Method method = enun.getClass().getMethod(getMethod);
writer.startNode(name);
writer.setValue(method.invoke(enun).toString());
writer.endNode();
}
catch (Exception e) {
}
}
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context){
return null;
}
}