文章目录
- 引言
- I 案例分析
- 1.1 接口签名计算
- 1.2 请求对象
- 1.3 枚举对象序列化
- 1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化
- 1.5 请求对象默认值处理
- II 在JSON中以枚举的code值来表示枚举的实现方式
- 2.1 自定义toString方法返回code
- 2.2 使用@JsonValue注解,只对ObjectMapper有效【推荐】
- 2.3 使用@JsonComponent注册JSON序列化器
- III 使用JsonComponent自定义JSON序列化器和反序列化器-枚举转换
- 3.1 JSON序列化器和反序列化器
- 3.2 用法
- 3.3 Jackson2ObjectMapperBuilder配置(被@JsonComponent替代)
- IV 请求枚举转换 实现Converter完成String到IEnum的转换
- 4.1 实现Converter完成String到IEnum的转换
- 4.2 WebMvc配置
- V 获取客户端发起请求时传递的参数
- 5.1 使用HttpServletRequest对象获取客户端发起请求时传递的参数
- 5.2 使用切面的JoinPoint.getArgs获取请求时传递的参数
引言
在Java中,每个对象都有一个toString方法,用于返回该对象的字符串表示。默认情况下,Enum类的toString方法返回的是枚举的名称,这在某些情况下可能不是我们想要的。
例如签名计算场景:使用Hutool的toJSONStr方法时,如果传递的是枚举对象,它会自动将枚举对象转换为相应的JSON字符串。 但是计算签名是使用以枚举的code值,因此需要自定义枚举的toString方法来实现。
间接解决方案:
- 将code和枚举名称定义为一样
- 使用HttpServletRequest对象获取客户端发起请求时传递的参数,而不是使用JoinPoint.getArgs
解决方案: 在Json中以枚举的code值表示枚举
- 需要重写枚举的toString。默认以枚举名称name表示
- 使用@JsonValue注解,只对ObjectMapper有效。
- 使用@JsonComponent注册JSON序列化器【推荐这种方式,更通用,影响范围小,不用修改toString,toString默认返回枚举值有其他用途】
从Spring Boot 2.5.0版本开始