❃博主首页 :
「码到三十五」 ,同名公众号 :「码到三十五」
♝博主的话 :
搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基
文章目录
- 1. 使用`@JsonSerialize`和`@JsonDeserialize`注解
- 2. 全局配置Jackson的`ObjectMapper`
- 3. 使用`@ControllerAdvice`配合`@InitBinder`
- 4. 自定义HttpMessageConverter
- 5. 使用AOP进行切面编程
- 结语
在Spring Boot , Spring Cloud中,对接口的请求入参和出参进行自定义的序列化和反序列化增强,通常有以下几种方法:
1. 使用@JsonSerialize
和@JsonDeserialize
注解
可以在实体类的字段上使用这两个注解来指定自定义的序列化器和反序列化器。
使用场景:
- 当需要对某个特定字段进行自定义的序列化和反序列化时。
- 当实体类中的某些字段类型不是标准的JSON类型,需要转换成JSON能识别的格式时。
- 需要在序列化和反序列化过程中添加自定义逻辑,如加密、解密、格式转换等。
首先,定义自定义的序列化器和反序列化器:
然后,在实体类中使用这些注解:
2. 全局配置Jackson的ObjectMapper
通过配置ObjectMapper
来全局地改变序列化和反序列化的行为,可以添加自定义的模块或配置属性。
使用场景:
- 当项目中多个实体类需要应用相同的序列化和反序列化规则时。
- 需要在全局范围内统一处理日期、时间、枚举等类型的序列化和反序列化。
- 需要对
ObjectMapper
进行全局的配置,如设置默认的时区、日期格式等。
创建一个自定义模块,并注册序列化器和反序列化器:
然后,配置ObjectMapper
:
3. 使用@ControllerAdvice
配合@InitBinder
要对Spring MVC的控制器进行全局的配置,可以使用@ControllerAdvice
注解。然后,在这个类中使用@InitBinder
注解的方法来注册自定义的属性编辑器。
注意:@InitBinder
主要用于处理表单数据的绑定,对于JSON数据的序列化和反序列化,它并不是最直接的方法。但如果是处理非JSON格式的请求体(如表单数据),则可以使用此方法。
使用场景(对于JSON数据,更偏向于使用其他方法;对于表单数据):
- 当需要对表单数据的绑定进行自定义处理时。
- 当需要在多个控制器中复用相同的表单数据绑定逻辑时。
创建一个自定义的属性编辑器:
然后,在@ControllerAdvice
类中注册这个属性编辑器:
4. 自定义HttpMessageConverter
可以编写自定义的HttpMessageConverter
来处理特定的媒体类型,并在其中实现自定义的序列化和反序列化逻辑。然后,将其注册到Spring MVC的配置中。
使用场景:
- 当Spring Boot默认的
HttpMessageConverter
无法满足自定义的序列化和反序列化需求时。 - 当需要处理非标准的媒体类型时,如自定义的二进制格式或文本格式。
- 当需要在序列化和反序列化过程中应用复杂的业务逻辑时。
创建一个自定义的HttpMessageConverter
:
…省略很多代码…
…完整代码请关注博主公众号 [ 码到三十五 ] 回复 [ springboot ] 自动获取…
5. 使用AOP进行切面编程
可以使用Spring AOP来对控制器的方法进行切面,从而在方法执行前后进行自定义的序列化和反序列化操作。
使用场景:
- 当需要在不修改原有业务代码的情况下,对方法入参和出参进行额外的处理时。
- 当需要对多个控制器或方法中的入参和出参应用统一的处理逻辑时。
- 当处理逻辑与业务逻辑相对独立,且需要保持代码结构清晰时。
首先,定义一个切面:
注意:AOP通常用于横切关注点的处理,如日志、事务管理等,而不是用于修改方法的入参和出参。如果你需要修改入参和出参,通常建议使用其他方法,如自定义的HttpMessageConverter
或@ControllerAdvice
。在上面的AOP示例中看到了如何捕获方法的执行,但实际上修改入参是不推荐的,而出参的修改也通常不是AOP的最佳用途。如果确实需要在AOP中修改出参,你可能需要考虑使用@AfterReturning
注解,并检查返回值的类型,然后进行相应的处理。然而,更常见做法是使用Jackson的序列化特性或@ControllerAdvice
来全局处理响应体的格式。
结语
Spring Boot, Spring Cloud 中要增强请求出入参的方式中, 通常,对于简单的自定义需求,使用@JsonSerialize
和@JsonDeserialize
注解是最直接和简单的方式。而对于更复杂的全局配置或跨多个控制器的需求,则可能需要使用ObjectMapper
的配置或@ControllerAdvice
。
关注公众号[码到三十五]获取更多技术干货 !