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 模型的发布请求,该请求在正文中发送一个映射,例如
{Red : 255, Green : 0, Blue: 0}

到使用的弹簧控制端点

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

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

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

4

2 回答 2

5

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

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

于 2013-07-01T15:40:18.070 回答
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 ());
  }
于 2013-07-01T15:47:20.317 回答