使用@RequestBody将JSON转换为Enum类型
我有一个主枚举类,它本质上是一种对象的类定义。 例如,它看起来像下面的示例:
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 colorMapping)
我收到以下错误消息:
无法从String“Red”构造ColorDefinition类型的Map键:不是有效的表示:无法从String“Red”构造ColorDefinition类型的Map键:不是Enum类的值之一
我在这做错了什么? 我是否需要在枚举类中使用其他方法来正确转换传入的枚举值? 它应该使用枚举中的另一个值(我已经尝试过它们没有成功)? 任何帮助是值得赞赏的,似乎这应该可以自动转换传入的值,我只是想不出来!
错误消息解释了什么是错误的: ColorDefinition
没有Red
定义。 案件需要匹配; 枚举值区分大小写。 JSON中的键需要为RED
, GREEN
和BLUE
。
在内部,Spring使用valueOf
来获取String的枚举表示。 在反序列化期间, ColorDefinition.valueOf("Red")
将抛出IllegalArgumentException
因为ColorDefinition
没有Red
的ColorDefinition
。 Spring会拦截此exception,这就是您看到错误消息的原因。 但是, ColorDefinition.valueOf("RED")
将返回ColorDefinition.RED
因为ColorDefinition.RED
有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 ()); }