java-使用@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<ColorDefinition, Integer> colorMapping)

我收到以下错误消息:
无法从字符串“ Red”构造类型为ColorDefinition的Map键:无效的表示形式:无法从字符串“ Red”构造类型为ColorDefinition的Map键:不是Enum类的值之一
我在这里做错了什么?我是否需要枚举类中的其他方法来正确转换传入的枚举值?它是否应该使用枚举中的另一个值(我没有成功尝试过它们)?任何帮助表示赞赏,似乎应该可以自动转换输入值,我只是想不通!

最佳答案

错误消息说明了出了什么问题:ColorDefinition中没有Red的定义.情况需要匹配;枚举值区分大小写. JSON中的键必须是红色,绿色和蓝色.

在内部,Spring使用valueOf来获取String的枚举表示形式.反序列化期间,因为ColorDefinition中没有红色的定义,所以ColorDefinition.valueOf(“ Red”)将抛出IllegalArgumentException. Spring会拦截此异常,这就是为什么您看到错误消息的原因.但是,由于ColorDefinition中有RED的定义,因此ColorDefinition.valueOf(“ RED”)将返回ColorDefinition.RED.

评论