2012-10-03 98 views
3

这里是从XML提取物,我想解析:西河和枚举解组:没有枚举常量

<node version="1.0.7" errorCode="0" message=""> 

的errorCode实际上是一组固定的常数,所以我认为这将是代表一个好主意它作为一个枚举:

public enum ErrorCode { 
OK (0,"ok"), 
ERR (1,"Error"), 
BIGERR (2,"Big Error"); 

private int code; 

private String name; 

ErrorCode(int code, String name) {...} 
} 

我不知道如何映射的“0”,在我的枚举中定义的各种常数的xml文件... 我不断获取转换意外没有枚举常数:

com.thoughtworks.xstream.converters.ConversionException: No enum constant my.package.ErrorCode.0 

我不知道如何为值指定别名...(或者如果我必须实现我自己的转换器)。

谢谢..

回答

1

我有同样的问题,我已经通过创建一个转换器类解决了这个问题。

public class MyEnumConverter implements Converter { 

    public static MyEnumConverter getInstance() { 
    return new MyEnumConverter(); 
    } 

    public void marshal(Object value, HierarchicalStreamWriter writer, 
      MarshallingContext context) { 
     context.convertAnother(value, new EnumConverter()); 
    } 

    //method that return the enum value by string 
    //if value equals return the correct enum value 
    public Object unmarshal(HierarchicalStreamReader reader, 
      UnmarshallingContext context) { 
     return MyEnum.get(reader.getValue()); //method get implemented in enum 
    } 

    @SuppressWarnings("rawtypes") 
    public boolean canConvert(Class clazz) { 
     return MyEnum.class.isAssignableFrom(clazz); 
    } 
} 

不要忘记注册的转换器

xstream.registerConverter(MyEnumConverter.getInstance()); 
3

我与EnumToStringConverter

Map<String, ErrorCode> map = new HashMap<>(); 
map.put(ErrorCode.OK.getCode(), Error.OK); 
map.put(ErrorCode.ERR.getCode(), Error.ERR); 
map.put(ErrorCode.BIGERR.getCode(), Error.BIGERR); 
xstream.registerConverter(new EnumToStringConverter<>(ErrorCode.class, map); 
做到了这一点