2012-10-03 176 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); 
做到了這一點