我有一个主枚举类,它本质上是一种对象的类定义。例如,它看起来像下面的示例:
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类的值之一
我在这做错了什么?我是否需要在枚举类中使用其他方法来正确转换传入的枚举值?它应该使用枚举中的另一个值(我尝试过它们没有成功)?任何帮助表示赞赏,似乎这应该可以自动转换传入的值,我只是想不出来!
答案 0 :(得分:4)
错误消息说明出现了什么问题:Red
内没有ColorDefinition
的定义。案件需要匹配;枚举值区分大小写。 JSON中的键必须为RED
,GREEN
和BLUE
。
在内部,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 ());
}