当前位置: 首页 > news >正文

Spring 对请求参数的优雅处方式(重写序列化方法)

Spring 对请求参数的优雅处方式(重写序列化方法)

  • 描述
  • 前端传参方式介绍
  • 代码实现:
    • 1、重写序列化方式代码
    • 2、设置类自动加载到 Spring 中

描述

在我们日常项目开发过程中,往往会遇到前端请求参数中有空格的情况,前端提交后后端的字符串什么形式的都有(例: " xxx ", " xxxxx ", “”, “null” 等等),这样不对空格进行处理直接传参,不仅浪费空间,还会造成数据跟查询结果有出入的情况,引起很多不必要的麻烦。那么,怎么快速的去除前端传参中字符串类型参数的前后空格呢?

前端传参方式介绍

在开发过程中,后端接收前端的传参有两种方式:

  1. 使用 url 或者 form 表单进行传参,后端通过 @RequestParam 注解的方式,从 url 中获取参数。
  2. 使用 body 进行传参,后端通过 @RequestBody 注解进行参数的接收。

对于 url 或者 form 表单的方式,我们在参数绑定时注册下面的类即可对参数进行处理

@RestControllerAdvice
public class GlobalHandler {private static final Logger LOGGER = LoggerFactory.getLogger(GlobalHandler.class);/***  url和form表单中的参数trim* @param binder*/@InitBinderpublic void initBinder(WebDataBinder binder) {// 构造方法中 boolean 参数含义为如果是空白字符串, 是否转换为 null// 即如果为 true, 那么 "" 会被转换为 null, 否者为""binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));}
}

对于使用 body 中的 JSON 或者 XML 的传参方式,在 Spring 中,默认是使用的 Jackson 对参数进行序列化处理,所以对 Jackson 加入如下的自定义转换器即可实现:

@Configuration
public class ApplicationConfig {/*** Request Body中JSON或XML对象参数trim** @return*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return jacksonObjectMapperBuilder -> {// 时区问题jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());jacksonObjectMapperBuilder.deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext ctx)throws IOException {// 去除前后空格return StringUtils.trimWhitespace(jsonParser.getValueAsString());}});};}
}

代码实现:

1、重写序列化方式代码

对于上述的两种传参方式,我们优化一下,将两个合并成一个统一的类来进行实现;

package com.wblog.framework.config;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.servlet.Servlet;
import java.io.IOException;/*** 序列化处理前端请求数据的前后空格* @author wangxk* @date 2023-12-27*/
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class WebMvcStringTrimAutoConfiguration {@ControllerAdvicepublic static class ControllerStringParamTrimConfig {/*** url和form表单中的参数trim*/@InitBinderpublic void initBinder(WebDataBinder binder) {// 构造方法中 boolean 参数含义为如果是空白字符串,是否转换为null// 即如果为true,那么 " " 会被转换为 null,否者为 ""StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(false);binder.registerCustomEditor(String.class, stringTrimmerEditor);}}/*** Request Body中JSON或XML对象参数trim*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext ctx)throws IOException {System.out.println("Jackson2ObjectMapperBuilderCustomizer jsonParser.getValueAsString() = " + jsonParser.getValueAsString());return StringUtils.trimWhitespace(jsonParser.getValueAsString());}});}
}

2、设置类自动加载到 Spring 中

由于 Spring 启动时,是默认加载同级别目录下所有的 Bean,如果我们重写的 WebMvcStringTrimAutoConfiguration 类是在外部目录时,我们就需要手动去指定一下需要加载的类,在 resurces 下创建 META-INF/spring.factories 文件,将我们的类加到里面去:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wblog.framework.config.WebMvcStringTrimAutoConfiguration

参考链接:

  1. SpringBoot去除字符串类型参数的前后空格
  2. Springmvc请求参数的优雅处方式

相关文章:

Spring 对请求参数的优雅处方式(重写序列化方法)

Spring 对请求参数的优雅处方式&#xff08;重写序列化方法&#xff09; 描述前端传参方式介绍代码实现&#xff1a;1、重写序列化方式代码2、设置类自动加载到 Spring 中 描述 在我们日常项目开发过程中&#xff0c;往往会遇到前端请求参数中有空格的情况&#xff0c;前端提交…...

2024年中职“网络安全“—数字调查取证(attack817.pcapng)

目录 ​1.通过分析数据包找出恶意用户最初访问HTTP服务的包号&#xff0c;将该值作为Flag值提交, Flag格式为flag{xxx}&#xff1b; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口&#xff0c;将全部的端口号按照一定顺序作为Flag值&#xff0c;提示&#xff1a;注意端口…...

如何使用VsCode编译C语言?

下载VsCode (1) 解压到D盘跟目录 (2) 运行[vscode.reg]&#xff0c;注册右键菜单 (3) 进入[pack]文件夹&#xff0c;运行[install.bat]。安装基本插件。 下载mingw32 (1) 解压任意目录 (2) 我的电脑右键–高级系统设置–高级–环境变量–系统变量–Path(双击)–空白行(双击)–…...

SpringCloud 和 Linux 八股文第三期五问五答

SpringCloud 和 Linux 八股文第三期五问五答 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Linux常用命令 2&#xff09;如何查看测试项目的日志 一…...

组件通信方式

组件通信方式有&#xff1a;vuex&#xff0c;ref&#xff0c;父子通信&#xff08;父传子、子传父&#xff09;&#xff0c;兄弟通信(eventBus)&#xff0c; 祖先后代通信&#xff08;依赖注入&#xff09; 父传子&#xff1a;父组件内&#xff1a;在子组件标签上设置自定义属…...

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么&#xff1f;为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失&#xff0c;软件无法启动”&#xff1f; 首先&#xff0c;先来了解“kbdnecnt.DLL文件”是什么&#xff1f; kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…...

Linux账户安全

一.Linux账户与组的基本概念 在Limux操作系统中&#xff0c;每一个文件和程序都归属于一个特定的 “用户”。每个用户都由一个唯一的身份来标识&#xff0c;这个标识称为用户ID (UserID, UID )。系统中的每一个用户也至少需要属于一个“用户分组”&#xff0c;即由系统管理员所…...

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…...

程序员如何高效学习技术?

我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。 不少朋友每天都阅读技术文章&#xff0c;但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力&#xff0c;但是跳槽面试却屡屡碰壁。面试官问技术…...

一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例

在转行之前&#xff0c;我一直在思考&#xff0c;当代年轻人的真实生活情况究竟是什么样的。 朝九晚六&#xff0c;无休止的加班&#xff0c;每天往返于公司与家&#xff0c;没有一点点自己的生活&#xff0c;只能从心里面麻痹自己&#xff0c;以求得最后的慰籍。 这就是我之…...

三.Linux无名管道(PIPE)和有名管道(FIFO)的区别

目录 命名管道&#xff08;Named Pipe&#xff09;&#xff1a; 无名管道&#xff08;Anonymous Pipe&#xff09;&#xff1a; 总结&#xff1a; 无名管道&#xff08;Anonymous Pipe&#xff09;和命名管道&#xff08;Named Pipe&#xff09;都是进程间通信的机制&#x…...

英文字母替换加密(后移n位)

思路&#xff1a;首先写出后移&#xff08;前移&#xff09;1位的情况 &#xff0c; 然后逐渐累加至N位情况 #include <stdio.h> void test(char arr[] , int n ) { int i 0; int z 0; if( n < 0 ) { while( i ! n ) { …...

HAproxy群集

HAproxy群集 常见的集群调度器HAproxy 、nginx、LVS区别HAproxynginxlvs HAproxy介绍HAproxy特点HAproxy常见的负载均衡策略HAproxy会话保持HAproxy配置实例 常见的集群调度器 常见的web集群调度器分为软件和硬件 软件&#xff1a;LVS Haproxy nginx 硬件&#xff1a; F5 Ar…...

LeetCode2469. Convert the Temperature

文章目录 一、题目二、题解 一、题目 You are given a non-negative floating point number rounded to two decimal places celsius, that denotes the temperature in Celsius. You should convert Celsius into Kelvin and Fahrenheit and return it as an array ans [ke…...

【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义

ROS2接口与自定义 引言1 ROS2自带接口1.1 ROS2通用标准消息包1.2 ROS2传感器消息包1.3 ROS2几何相关消息包 2 ROS2接口介绍2.1 常用CLI命令2.2 原始数据类型与包装类型 3 自定义接口示例3.1 接口定义3.2 自定义接口RCLPY 引言 笔者跟着鱼香ROS的ROS2学习之旅 学习参考&#xf…...

python c语言 代码动态检查,python c语言语法分析

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python c语言 代码动态检查&#xff0c;python c语言语法分析&#xff0c;今天让我们一起来看看吧&#xff01; Source code download: 本文相关源码 初学编程&#xff0c;应该学习哪一门编程语言&#xff0c;有不少人感…...

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…...

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…...

macos下php 5.6 7.0 7.4 8.0 8.3 8.4全版本PHP开发环境安装方法

在macos中如果使用brew 官方默认的core tap 只可以安装官方最新的稳定版PHP, 如果想要安装 php 5.6 或者 php 8.4版本的PHP就需要使用第三方的tap , 这里分享一个比较全面的brew tap shivammathur/php 这个tap里面包含了从php5.6到最新版php8.4的所有可用最新版本PHP, 而且是同…...

Chatgpt为什么像打字机逐字输出?磨洋工,防止数据库被盗

在他后台的数据库里肯定是完整的结果,每次只给你一个单词一个单词的输送,一方面是为了耍酷&#xff0c;好像真的是一个人在那给你说话&#xff0c;另一方面也是防止第三方的抄袭者最快速度盗取采集偷走数据库。防止他们的服务器崩溃&#xff0c;可以多收几个月会员费。 都说搞…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...