使用@RequestBody将JSON转换为枚举类型

3

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

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请求,该请求在主体中发送了一个映射,例如
{Red : 255, Green : 0, Blue: 0}

发送到一个使用Spring控制的端点。

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

我得到了以下错误信息:
无法从字符串“Red”构造类型为ColorDefinition的映射键:不是有效表示:无法从字符串“Red”构造类型为ColorDefinition的映射键:不属于Enum类的值之一。

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

你能找到解决方法吗?我有一个类似的问题,不知道该怎么办。 - ion20
2个回答

5
错误信息解释了出现的问题:在ColorDefinition中没有定义Red。大小写需要匹配;枚举值是区分大小写的。您的JSON中的键需要是REDGREENBLUE
在内部,Spring使用valueOf来获取字符串的枚举表示。在反序列化期间,ColorDefinition.valueOf("Red")将抛出一个IllegalArgumentException,因为ColorDefinition中没有定义Red。这个异常被Spring拦截,这就是为什么你看到一个错误消息。然而,ColorDefinition.valueOf("RED")将返回ColorDefinition.RED,因为在ColorDefinition中定义了RED

谢谢您进一步的解释,这对我很有帮助! - Eddie D

0

如果您需要处理混合大小写(Red),您可以像这样做:

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

我一直无法正确地使其工作...这可能只适用于路径/参数变量,而不适用于请求体吗? - raven-king

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接