在项目中常常遇到前端请求发送的 Integer 类型的数据来匹配后端中的枚举类型,此时常常出提示类型转换错误,出现这种错误的主要原因是其默认的请求参数转换是使用传入的参数去匹配枚举的 name,而不是对应的 code。对此,介绍请求参数转换流程以及举例说明。
前端请求的转换流程如下图所示:

前端将请求发送到 SpringMVC 中,首先通过 WebDataBinder 组件将 HTTP 请求参数绑定到 Controller 方法的参数,并实现参数类型的转换;数据从 SpringMVC 发送到数据库时,通过 Mybatis 中的 TypeHandler 将枚举类型的数据和数据库之间的数据类型进行转换对应。
其中 WebDataBinder 依赖于 Converter 实现类型转换,但是其 String 到枚举类型的默认转换规则是根据实例名称转换为枚举对象实例,如果需要实现 code 属性到枚举对象实例的转换,需要自定义 Converter。
后端响应的流程:

SpringMVC 中的HTTPMessageConverter组件负责将 Controller 方法的返回值(Java 对象)转换为 HTTP 响应体中的 JSON 字符串,或者将请求体中的 JSON 字符串转换为 Controller 方法中的参数(Java 对象),当请求体中是以 json 的方式发送给后端时,其将使用HTTPMessageConverter组件将其加载到 SpringMVC 中。

实例:
请求 Controller:

枚举类:

自定义转换类:

在 webMvcConfiguration 中注册自定义转换类:

当需要转换多个枚举时,其需要自定义多个转换类,容易出现重复代码,此时可以通过ConverterFactory以工厂的方式,实现对所有枚举类的转化。但需要转换的枚举类需要有共同的父类,如下例中其枚举继承BaseEnum.

