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

Edd*_*e D 3 java enums spring 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)....
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试从 Javascript 模型设置一个 post 请求,它在正文中发送一个映射,例如
{Red : 255, Green : 0, Blue: 0}

到一个使用 spring 控制的端点

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

我收到以下错误消息:
无法从字符串“Red”构造 ColorDefinition 类型的映射键:不是有效表示:无法从字符串“Red”构造 ColorDefinition 类型的映射键:不是枚举类的值之一

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

Viv*_*ath 5

错误消息说明出了什么问题:Redinside没有定义ColorDefinition。案例需要匹配;枚举值区分大小写。在你的JSON需要的关键是REDGREENBLUE

在内部,Spring 用于valueOf获取 String 的枚举表示。在反序列化期间,ColorDefinition.valueOf("Red")将抛出 ,IllegalArgumentException因为没有定义Redin ColorDefinition。这个异常被Spring拦截了,这就是为什么你会看到一个错误信息。但是,ColorDefinition.valueOf("RED")会返回,ColorDefinition.RED因为有REDin的定义ColorDefinition