2013-07-01 51 views
3

我有一個主枚舉類,它本質上是一種對象類的類定義。例如,它看起來像下面的例子:使用@RequestBody將JSON轉換爲枚舉類型

public enum ColorDefinition 
{ 
    private String abbrev; 
    private String color; 
    private Class colorClass; 
    RED("RD", "Red", Red.class), 
    GREEN("GN", "Green", Green.class), 
    BLUE("BL", "Blue", Blue.class).... 
} 

我試圖建立一條從一個Javascript模式,即在身體如
{紅髮的映射POST請求:255,綠:0藍:0}

要使用

@RequestMapping(value = "v1/color/EnableColors", method = RequestMethod.POST) 
@ResponseBody 
public ResponseObject enableColors(@RequestBody Map<ColorDefinition, Integer> colorMapping) 

要我收到以下錯誤消息的彈簧控制端點:
不能構造從字符串「紅」型ColorDefinition的地圖鍵:不有效的重新演示文稿:不能從字符串「紅色」構造ColorDefinition類型的Map鍵:不是Enum類的值之一

我在這裏做錯了什麼?在枚舉類中是否需要其他方法來正確轉換傳入的枚舉值?是否應該使用枚舉中的另一個值(我試過它們沒有成功)?任何幫助表示讚賞,似乎這應該是可以自動轉換傳入的值,我只是無法弄清楚!

+0

是你能找到一個解決辦法?我有類似的問題,不知道該怎麼辦.. – ion20

回答

3

錯誤信息說明發生了什麼問題:ColorDefinition內部沒有Red的定義。該案件需要匹配;枚舉值區分大小寫。您的JSON中的密鑰必須是RED,GREENBLUE

在內部,Spring使用valueOf來獲取字符串的枚舉表示。在反序列化期間,ColorDefinition.valueOf("Red")將拋出IllegalArgumentException,因爲在ColorDefinition中沒有Red的定義。這個異常被Spring攔截,這就是爲什麼你會看到一個錯誤信息。但ColorDefinition.valueOf("RED")將返回ColorDefinition.RED,因爲ColorDefinition中存在RED的定義。

+0

感謝您的進一步解釋,這有助於很多! –

0

如果您需要處理混合大小寫(紅色),你可以做這樣的事情:

public static class MyConverter extends PropertyEditorSupport { 
    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
     setValue(ColorDefinition.valueOf(text.toUpperCase())); 
    }  
    } 

    @InitBinder 
    public void initBinder(WebDataBinder binder) 
    { 
    binder.registerCustomEditor(ColorDefinition.class, new MyConverter()); 
    } 
+0

我還沒有能夠正確地工作......這可能只適用於路徑/參數變量,而不是正文? – JLove