使用@RequestBody将JSON转换为Enum类型

我有一个主枚举类,它本质上是一种对象的类定义。 例如,它看起来像下面的示例:

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模型设置发布请求,该请求在正文中发送映射,例如
{红色:255,绿色:0,蓝色:0}

到使用的弹簧控制端点

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

我收到以下错误消息:
无法从String“Red”构造ColorDefinition类型的Map键:不是有效的表示:无法从String“Red”构造ColorDefinition类型的Map键:不是Enum类的值之一

我在这做错了什么? 我是否需要在枚举类中使用其他方法来正确转换传入的枚举值? 它应该使用枚举中的另一个值(我已经尝试过它们没有成功)? 任何帮助是值得赞赏的,似乎这应该可以自动转换传入的值,我只是想不出来!

错误消息解释了什么是错误的: ColorDefinition没有Red定义。 案件需要匹配; 枚举值区分大小写。 JSON中的键需要为REDGREENBLUE

在内部,Spring使用valueOf来获取String的枚举表示。 在反序列化期间, ColorDefinition.valueOf("Red")将抛出IllegalArgumentException因为ColorDefinition没有RedColorDefinition 。 Spring会拦截此exception,这就是您看到错误消息的原因。 但是, ColorDefinition.valueOf("RED")将返回ColorDefinition.RED因为ColorDefinition.REDRED的定义。

如果你需要处理混合大小写(红色),你可以这样做:

  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 ()); }