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

时间:2013-07-01 15:22:53

标签: java json spring enums

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

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键:不是有效的表示:不能从String“Red”构造ColorDefinition类型的Map键:不是Enum类的值之一

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

2 个答案:

答案 0 :(得分:4)

错误消息说明出现了什么问题:Red内没有ColorDefinition的定义。案件需要匹配;枚举值区分大小写。 JSON中的键必须为REDGREENBLUE

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

答案 1 :(得分: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 ());
  }