实战: SpringBoot中5种增强的方法 : 加解密、脱敏、格式转换、时间时区处理(码到三十五)

  • 1. 使用@JsonSerialize和@JsonDeserialize注解

  • 2. 全局配置Jackson的ObjectMapper

  • 3. 使用@ControllerAdvice配合@InitBinder

  • 4.  自定义HttpMessageConverter

  • 5. 使用AOP进行切面编程

  • 结语

在Spring Boot中,对接口的请求入参和出参进行自定义的增强或者修改,通常有以下几种方法:

1. 使用@JsonSerialize@JsonDeserialize注解

可以在实体类的字段上使用这两个注解来指定自定义的序列化器和反序列化器。

「使用场景」

  • 当需要对某个特定字段进行自定义的序列化和反序列化时。

  • 当实体类中的某些字段类型不是标准的JSON类型,需要转换成JSON能识别的格式时。

  • 需要在序列化和反序列化过程中添加自定义逻辑,如加密、解密、格式转换等。

首先,定义自定义的序列化器和反序列化器:

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {    @Override    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {        gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));    }}
public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {    @Override    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {        return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));    }}

然后,在实体类中使用这些注解:

public class MyEntity {    @JsonSerialize(using = CustomLocalDateTimeSerializer.class)    @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)    private LocalDateTime dateTime;
    // getters and setters}

2. 全局配置Jackson的ObjectMapper

通过配置ObjectMapper来全局地改变序列化和反序列化的行为,可以添加自定义的模块或配置属性。

「使用场景」

  • 当项目中多个实体类需要应用相同的序列化和反序列化规则时。

  • 需要在全局范围内统一处理日期、时间、枚举等类型的序列化和反序列化。

  • 需要对ObjectMapper进行全局的配置,如设置默认的时区、日期格式等。

创建一个自定义模块,并注册序列化器和反序列化器:

public class CustomJacksonModule extends SimpleModule {    public CustomJacksonModule() {        addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());        addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer());    }}

然后,配置ObjectMapper

@Beanpublic Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {    return builder -> {        builder.modules(new CustomJacksonModule());    };}

3. 使用@ControllerAdvice配合@InitBinder

要对Spring MVC的控制器进行全局的配置,可以使用@ControllerAdvice注解。然后,在这个类中使用@InitBinder注解的方法来注册自定义的属性编辑器。

「注意」@InitBinder主要用于处理表单数据的绑定,对于JSON数据的序列化和反序列化,它并不是最直接的方法。但如果是处理非JSON格式的请求体(如表单数据),则可以使用此方法。

「使用场景」(对于JSON数据,更偏向于使用其他方法;对于表单数据):

  • 当需要对表单数据的绑定进行自定义处理时。

  • 当需要在多个控制器中复用相同的表单数据绑定逻辑时。

创建一个自定义的属性编辑器:

public class CustomLocalDateTimeEditor extends PropertyEditorSupport {    @Override    public void setAsText(String text) throws IllegalArgumentException {        setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));    }
    @Override    public String getAsText() {        LocalDateTime value = (LocalDateTime) getValue();        return value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));    }}

然后,在@ControllerAdvice类中注册这个属性编辑器:

@ControllerAdvicepublic class CustomControllerAdvice {    @InitBinder    public void initBinder(WebDataBinder binder) {        binder.registerCustomEditor(LocalDateTime.class, new CustomLocalDateTimeEditor());    }}

4.  自定义HttpMessageConverter

可以编写自定义的HttpMessageConverter来处理特定的媒体类型,并在其中实现自定义的序列化和反序列化逻辑。然后,将其注册到Spring MVC的配置中。

「使用场景」

  • 当Spring Boot默认的HttpMessageConverter无法满足自定义的序列化和反序列化需求时。

  • 当需要处理非标准的媒体类型时,如自定义的二进制格式或文本格式。

  • 当需要在序列化和反序列化过程中应用复杂的业务逻辑时。

创建一个自定义的HttpMessageConverter

public class CustomLocalDateTimeConverter extends MappingJackson2HttpMessageConverter {    public CustomLocalDateTimeConverter() {        super();        ObjectMapper customObjectMapper = new ObjectMapper();        customObjectMapper.registerModule(new CustomJacksonModule());        setObjectMapper(customObjectMapper);    }}

然后,在配置类中注册这个转换器:

@Configurationpublic class WebConfig implements WebMvcConfigurer {    @Override    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {        converters.add(0, new CustomLocalDateTimeConverter());    }}

5. 使用AOP进行切面编程

可以使用Spring AOP来对控制器的方法进行切面,从而在方法执行前后进行自定义的序列化和反序列化操作。

「使用场景」

  • 当需要在不修改原有业务代码的情况下,对方法入参和出参进行额外的处理时。

  • 当需要对多个控制器或方法中的入参和出参应用统一的处理逻辑时。

  • 当处理逻辑与业务逻辑相对独立,且需要保持代码结构清晰时。

首先,定义一个切面:

@Aspect@Componentpublic class CustomSerializationAspect {    @Before("execution(* com.example.controller..*.*(..)) && args(..,@RequestParam(..),@RequestBody(..))")    public void beforeControllerMethod(JoinPoint joinPoint) {        // 在这里可以修改入参,但通常不建议这么做,因为这会改变方法的签名        // 更常见的是在处理响应后进行修改    }
    @AfterReturning(pointcut = "execution(* com.example.controller..*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)", returning = "result")    public void afterControllerMethod(JoinPoint joinPoint, Object result) {        // 在这里可以修改出参,例如将LocalDateTime转换为特定格式的字符串        if (result instanceof MyEntity) {            MyEntity entity = (MyEntity) result;            // 假设你想在这里修改entity的dateTime字段        }    }}

注意:AOP通常用于横切关注点的处理,如日志、事务管理等,而不是用于修改方法的入参和出参。如果你需要修改入参和出参,通常建议使用其他方法,如自定义的HttpMessageConverter@ControllerAdvice。上面的AOP中捕获方法的执行,但实际上修改入参是不推荐的,而出参的修改也通常不是AOP的最佳用途。如确实要在AOP中修改出参,考虑使用@AfterReturning注解。更常见和推荐的做法使用Jackson的序列化特性或@ControllerAdvice来全局处理响应体的格式。

结语

选择哪种方法取决于具体需求。对于简单的自定义需求,使用@JsonSerialize@JsonDeserialize注解是最直接和简单的方式。而对于更复杂的全局配置或跨多个控制器的需求,则可能需要使用ObjectMapper的配置或@ControllerAdvice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理笔记(三) ---- 傅里叶变换的基本原理

系列文章目录 数字图像处理笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、傅里叶变换二、离散傅里叶变…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章&#xff0c;有着一个动听的配音&#xff0c;没错&#xff0c;他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型&#xff0c;在Git收获23.5k的Star&#xff…

Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......

探索目标&#xff1a;Android中集成前端页面 之前使用的webview加载html页面&#xff0c;使用bridge的方式进行原生安卓和html页面的通信的方式&#xff0c;探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…

可消费的媒体类型和可生成的媒体类型

可消费的媒体类型和可生成的媒体类型 在 Spring MVC 中&#xff0c;“可消费的媒体类型”和“可生成的媒体类型”是两个重要的概念&#xff0c;用于控制控制器方法处理和返回的内容类型。它们分别通过 consumes 和 produces 属性来指定。下面是它们的详细区别&#xff1a; 可…

【Pod 详解】Pod 的概念、使用方法、容器类型

《Pod 详解》系列&#xff0c;共包含以下几篇文章&#xff1a; Pod 的概念、使用方法、容器类型Pod 的生命周期&#xff08;一&#xff09;&#xff1a;Pod 阶段与状况、容器的状态与重启策略Pod 的生命周期&#xff08;二&#xff09;&#xff1a;Pod 的健康检查之容器探针Po…

C++入门基础:C++中的常用操作符练习

开头介绍下C语言先&#xff0c;C是一种广泛使用的计算机程序设计语言&#xff0c;起源于20世纪80年代&#xff0c;由比雅尼斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展&#xff0c;增加了面向对象编程的特性。C的应用场景广泛&#xff0c;包括系统软件、游戏开发、嵌入式…

智慧医院临床检验管理系统源码(LIS),全套LIS系统源码交付,商业源码,自主版权,支持二次开发

实验室信息系统是集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。一体化设计&#xff0c;与其他系统无缝连接&#xff0c;全程化条码管理。支持危机值管…

DataX(二):DataX安装与入门

1. 官方地址 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 源码地址&#xff1a;GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2. 前置要求 Linux JDK(1.8 以上&#xff0c;推荐 1.8) Python(推荐 Pyt…

一文总结代理:代理模式、代理服务器

概述 代理在计算机编程领域&#xff0c;是一个很通用的概念&#xff0c;包括&#xff1a;代理设计模式&#xff0c;代理服务器等。 代理类持有具体实现类的实例&#xff0c;将在代理类上的操作转化为实例上方法的调用。为某个对象提供一个代理&#xff0c;以控制对这个对象的…

测试分类篇

按测试对象划分 这里可以分为界面测试, 可靠性测试, 容错率测试, 文档测试, 兼容性测试, 安装卸载测试, 安全测试, 性能测试, 内存泄露测试. 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;指按照界面的需求&#xff08;一般是UI设计稿&#xff09;和界面的设计规则…

Vue3+element-plus 实现图片图片

在看下面内容之前,请一定要去看看 element-plus 中上传组件 el-upload组件 上传组件 重点关注下面几个属性 :auto-upload“false” , 关闭自动上传 :on-change“onUploadFile” 监听上传情况 简单示例: <el-form-item label"文章封面" prop"cover_img"&…

flume知识点

1. 简述什么是Flume &#xff1f; flume 作为 cloudera 开发的实时日志收集系统&#xff0c;受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG&#xff08;original generation&#xff09;&#xff0c;属于 cloudera。 但随着 FLume 功能的扩展&#…

AI大模型学习必备十大网站

随着人工智能技术的快速发展&#xff0c;AI大模型&#xff08;如GPT-3、BERT等&#xff09;在自然语言处理、计算机视觉等领域取得了显著的成果。对于希望深入学习AI大模型的开发者和研究者来说&#xff0c;找到合适的学习资源至关重要。本文将为大家推荐十大必备网站&#xff…

[AI]在家中使用日常设备运行您自己的 AI 集群.适用于移动、桌面和服务器的分布式 LLM 推理。

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” AI发展不可谓不快, 从ollama个人电脑CPU运行到现在,日常设备AI集群. 下面对比一下,两款开源AI 大模型的分布式推理应用, exo 和cake. 1.AI 集群推理应用exo 和cake的简单对比 #mermaid-s…

DOS攻击实验

实验背景 Dos 攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段&#xff0c;残忍地耗尽被攻击对象的资源&#xff0c;目的是让目标计算机或网络无法提供正常的服务或资源访问&#xff0c;使目标系统服务系统停止响应甚至崩溃。 实验设备 一个网络 net:cloud0 一台模…

在Ubuntu 18.04上安装和使用PostgreSQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种结构化的方式来存储、组织和访问信息。 PostgreSQL&#xf…

基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)

基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序&#xff0c;可以方便管理人员对儿童预防接种预约微信小程序的管理&#xff0c;提高信息管理工作效率及查询…

24暑假算法刷题 | Day22 | LeetCode 77. 组合,216. 组合总和 III,17. 电话号码的字母组合

目录 77. 组合题目描述题解 216. 组合总和 III题目描述题解 17. 电话号码的字母组合题目描述题解 77. 组合 点此跳转题目链接 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输…

移动UI:排行榜单页面如何设计,从这五点入手,附示例。

移动UI的排行榜单页面设计需要考虑以下几个方面&#xff1a; 1. 页面布局&#xff1a; 排行榜单页面的布局应该清晰明了&#xff0c;可以采用列表的形式展示排行榜内容&#xff0c;同时考虑到移动设备的屏幕大小&#xff0c;应该设计合理的滚动和分页机制&#xff0c;确保用户…

贪心算法.

哈夫曼树 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称为霍夫曼树或最优二叉树&#xff0c;是一种带权路径长度最短的二叉树&#xff0c;常用于数据压缩。 定义&#xff1a;给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树…