首先,提供了一個接口,將提供一個缺省值,如果枚舉是未知的。
public interface EnumWithDefault<E extends Enum<E>> {
E getDefault();
}
枚舉,可能有未來的增加應該實現此接口:
public enum MyEnum implements EnumWithDefault<MyEnum>{
ENUM_IN_VERSION_1, FUTURE;
public MyEnum getDefault(){ return FUTURE; }
}
註冊一個TranslatorFactory一旦實施,將提供默認:
return new ValueTranslator<Enum<?>, String>(path, String.class) {
@Override
public Enum<?> loadValue(String value, LoadContext ctx) {
try{
return Enum.valueOf((Class<Enum>)type, value.toString());
}catch(Exception e){
if (EnumWithDefault.class.isAssignableFrom(enumType)) {
EnumWithDefault<E> any = (EnumWithDefault<E>) enumType.getEnumConstants()[0];
result = any.getDefault();
}else{
throw e;
}
}
}
部署新的枚舉第2版:
public enum MyEnum implements EnumWithDefault<MyEnum>{
ENUM_IN_VERSION_1, ENUM_IN_VERSION_2, FUTURE;
public MyEnum getDefault(){ return FUTURE; }
}
當應用程序的版本2被部署和ENUM_IN_VERSION_2被存儲在相關的一些實體數據存儲區,響應射到兩個版本的端點時不同。
擊中的第一版本返回值FUTURE允許客戶端呈現一個適當的消息:
http://1.myapi.appspot.com/entities
回報:
<myEntity id='xyz' category='FUTURE' />
擊中版本2提供新的枚舉:
http://2.myapi.appspot.com/entities
回報:
<myEntity id='xyz' category='ENUM_IN_VERSION_2' />
該溶液允許添加和在以後的版本中使用而舊版本呈現的值,以每合同中的「未來」是可能的客戶機附加枚舉。
你的建議是有可能的情況,一個是我們正在使用的代碼維護目的枚舉的重命名的情況。然而,對於增加我們希望使用具有新功能的新枚舉,這是痛苦的建立新的功能,而不是使用它。我們希望把這些多個版本數週或數月運行並排側,以便我們的特點將通過此枚舉限制的人質。 –
我真的不知道你在找什麼樣的解決方案。您想要將一些新數據寫入數據存儲區,舊版應用程序無法理解。沒有什麼魔力,你需要讓你的舊版本適度地處理新的數據,然後才能更改數據結構。這適用於任何類型的遷移,而不僅僅是枚舉。 – stickfigure