【问题标题】:Converting JSON to Enum type with @RequestBody使用 @RequestBody 将 JSON 转换为 Enum 类型
【发布时间】:2013-07-01 15:22:52
【问题描述】:

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

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 键:不是枚举类的值之一

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

【问题讨论】:

  • 您找到解决方法了吗?我有类似的问题,不知道该怎么办..

标签: java json spring enums


【解决方案1】:

错误消息解释了问题所在:ColorDefinition 内部没有Red 的定义。案例需要匹配;枚举值区分大小写。 JSON 中的键必须是 REDGREENBLUE

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

【讨论】:

  • 感谢您的进一步解释,这很有帮助!
【解决方案2】:

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

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

【讨论】:

  • 我无法让它正常工作......这是否可能只适用于路径/参数变量,而不适用于正文?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多