做搜狗手机网站点做建网站

news/2025/9/22 15:45:35/文章来源:
做搜狗手机网站点,做建网站,深圳龙华医院网站建设,千阳做网站#x1f680; 前端字段名和后端不一致#xff1f;解锁 JSON 映射的“隐藏规则” #x1f31f; 嘿#xff0c;技术冒险家们#xff01;#x1f44b; 今天我们要聊一个开发中常见的“坑”#xff1a;前端传来的 JSON 参数字段名和后端对象字段名不一致#xff0c;会发生… 前端字段名和后端不一致解锁 JSON 映射的“隐藏规则” 嘿技术冒险家们 今天我们要聊一个开发中常见的“坑”前端传来的 JSON 参数字段名和后端对象字段名不一致会发生什么是默默失败还是直接炸裂 我将以 Spring 的 PageWithSearch 为例带你揭开 Jackson 的神秘面纱还有流程图助阵快跟我一起探索吧 第一幕一场“命名失误”的意外 问题起源 我在开发一个分页查询接口前端传了个 JSON {searchField: name,searchValue: John,pageNum: 0,pageSize: 10 }后端用 PageWithSearch 接收 PostMapping(/listInviteCodeByPageWithSearch) public BaseResult listInviteCodeByPageWithSearch(Valid RequestBody PageWithSearch pageWithSearch) {PageInviteCode inviteCodePage inviteCodeService.findPaginatedInviteCodeByAdminIdAndSearch(7, pageWithSearch);return BaseResult.success(inviteCodePage); }结果服务层抛了个 NullPointerException接口返回 {code: 500,msg: 分页查询失败null,data: null }啥明明传了 pageNum 和 pageSize怎么炸了 第二幕深入代码寻找线索 关键代码 服务层 public PageInviteCode findPaginatedInviteCodeByAdminIdAndSearch(Integer adminId, PageWithSearch pageWithSearch) {PageRequest pageRequest PageRequest.of(pageWithSearch.getPage(), pageWithSearch.getPageSize());// ... 其他逻辑 ... }PageWithSearch 和 BasePage public class PageWithSearch extends BasePage {private String field;private String value;public Integer getPageSize() {return this.size;} }public class BasePage {Integer page;Integer size;public Integer getPage() {return page;}public Integer getSize() {return size;} }初步分析 前端字段pageNum、pageSize。后端字段page、size。问题字段名不一致pageWithSearch.getPage() 和 getPageSize() 返回 null导致 PageRequest.of 自动拆箱时抛出 NullPointerException。 第三幕Jackson 的“严格规则” 真相揭晓 Spring 默认用 Jackson 处理 JSON 到对象的映射它的规则很简单 字段名必须一致JSON 字段名与 Java 对象字段名大小写敏感匹配。不一致的结果未匹配的字段被忽略对象中对应字段保持默认值null。 测试验证 输入 {pageNum: 0,pageSize: 10 }pageWithSearch.getPage() → null无 page 字段。pageWithSearch.getPageSize() → null无 size 字段。PageRequest.of(null, null) → 自动拆箱 → NullPointerException。 Mermaid 流程图映射失败过程 #mermaid-svg-4NdoX6Pw4W3Q3TOl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .error-icon{fill:#552222;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .marker.cross{stroke:#333333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .cluster-label text{fill:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .cluster-label span{color:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .label text,#mermaid-svg-4NdoX6Pw4W3Q3TOl span{fill:#333;color:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .node rect,#mermaid-svg-4NdoX6Pw4W3Q3TOl .node circle,#mermaid-svg-4NdoX6Pw4W3Q3TOl .node ellipse,#mermaid-svg-4NdoX6Pw4W3Q3TOl .node polygon,#mermaid-svg-4NdoX6Pw4W3Q3TOl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .node .label{text-align:center;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .node.clickable{cursor:pointer;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .arrowheadPath{fill:#333333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .cluster text{fill:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl .cluster span{color:#333;}#mermaid-svg-4NdoX6Pw4W3Q3TOl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4NdoX6Pw4W3Q3TOl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 前端: pageNum0, pageSize10 Jackson 映射到 PageWithSearch page 未匹配, size 未匹配 getPage()null, getPageSize()null PageRequest.of(null, null) 自动拆箱抛 NullPointerException 返回 500: 分页查询失败null 第四幕解决“命名冲突” 为什么会这样 Jackson 的默认行为严格匹配不做自动转换。后端代码未处理字段名不一致导致 null 值引发下游问题。 解决方案 方案 1用 JsonProperty 指定映射 修改 BasePage 和 PageWithSearch public class BasePage {JsonProperty(pageNum)Integer page;JsonProperty(pageSize)Integer size;// ... 其他代码 ... }public class PageWithSearch extends BasePage {JsonProperty(searchField)private String field;JsonProperty(searchValue)private String value;// ... 其他代码 ... }效果 前端用 pageNum、pageSize、searchField后端正确映射。输入{searchField: name,pageNum: 0,pageSize: 10 }pageWithSearch.getPage() → 0pageWithSearch.getPageSize() → 10 方案 2全局命名策略 在 application.yml 中配置 spring:jackson:property-naming-strategy: SNAKE_CASE效果 前端用 page_num、page_size自动映射到 page、size。输入{field: name,page_num: 0,page_size: 10 }方案 3服务层防御 即使字段名不一致也避免异常 public PageInviteCode findPaginatedInviteCodeByAdminIdAndSearch(Integer adminId, PageWithSearch pageWithSearch) {Pageable pageable pageWithSearch.toPageableWithDefault(0, 10); // 默认值保护String field pageWithSearch.getField();String value pageWithSearch.getValue();if (!StringUtils.isEmpty(field) !StringUtils.isEmpty(value)) {return inviteCodeRepository.findPaginatedInviteCodeByAdminIdAndFieldAndValue(adminId, field, value, pageable);} else {return inviteCodeRepository.findByAdminId(adminId, pageable);} }效果 page 或 size 为 null 时用默认值 0 和 10。 Mermaid 流程图修复过程 #mermaid-svg-edI9dgBpEcOcs6SA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .error-icon{fill:#552222;}#mermaid-svg-edI9dgBpEcOcs6SA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-edI9dgBpEcOcs6SA .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-edI9dgBpEcOcs6SA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-edI9dgBpEcOcs6SA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-edI9dgBpEcOcs6SA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-edI9dgBpEcOcs6SA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-edI9dgBpEcOcs6SA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-edI9dgBpEcOcs6SA .marker.cross{stroke:#333333;}#mermaid-svg-edI9dgBpEcOcs6SA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-edI9dgBpEcOcs6SA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .cluster-label text{fill:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .cluster-label span{color:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .label text,#mermaid-svg-edI9dgBpEcOcs6SA span{fill:#333;color:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .node rect,#mermaid-svg-edI9dgBpEcOcs6SA .node circle,#mermaid-svg-edI9dgBpEcOcs6SA .node ellipse,#mermaid-svg-edI9dgBpEcOcs6SA .node polygon,#mermaid-svg-edI9dgBpEcOcs6SA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-edI9dgBpEcOcs6SA .node .label{text-align:center;}#mermaid-svg-edI9dgBpEcOcs6SA .node.clickable{cursor:pointer;}#mermaid-svg-edI9dgBpEcOcs6SA .arrowheadPath{fill:#333333;}#mermaid-svg-edI9dgBpEcOcs6SA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-edI9dgBpEcOcs6SA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-edI9dgBpEcOcs6SA .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-edI9dgBpEcOcs6SA .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-edI9dgBpEcOcs6SA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-edI9dgBpEcOcs6SA .cluster text{fill:#333;}#mermaid-svg-edI9dgBpEcOcs6SA .cluster span{color:#333;}#mermaid-svg-edI9dgBpEcOcs6SA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-edI9dgBpEcOcs6SA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 前端: pageNum0, pageSize10 方案 1: JsonProperty page0, size10 PageRequest.of(0, 10) 正常返回数据 方案 3: toPageableWithDefault page0, size10 第五幕经验与启发 学到了啥 Jackson 的严格匹配 字段名不一致后端字段变 null小心下游逻辑 命名约定很重要 前后端要统一字段名或者用工具桥接差异。 防御性编程 null 是隐患提前处理是王道。 小建议 文档化 用 Swagger 或 API 文档明确字段名减少误解。 日志排查log.info(Received: page{}, size{}, pageWithSearch.getPage(), pageWithSearch.getPageSize());尾声 从 500 错误的迷雾到揭开字段名不一致的真相这场 debug 让我对 JSON 映射有了新认识。希望这篇博客能帮你在前后端对接时少踩坑有问题欢迎留言咱们一起聊技术✌️

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

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

相关文章

报表神器Stimulsoft再升级!Stimulsoft Reports、Dashboards 和 PDF Forms 2025.4 即将发布!

报表神器Stimulsoft 即将推出 2025.4 新版本,本次更新带来了多项全新功能和优化修复,将为开发者与企业用户带来更高效、更灵活的报表与可视化体验。全球知名的报表解决方案服务商 Stimulsoft 即将推出 Stimulsoft Re…

题解:AT_agc027_e [AGC027E] ABBreviate

题意:很简单了,不再赘述。 做法: 我们先考虑最后的串会被更新成什么样子,发现应该是一段区间会缩起来成为一个字符,那么我们考虑一段怎么样的区间会变成 a 或 b。 我们考虑一个能缩的区间会缩成什么或者不能缩,首…

【PostgreSQL 17】11 窗口函数

直接这么写会报错,缺少GROUP BY SELECTemployee_id,first_name,last_name,salary,AVG(salary) FROM employees ;添加OVER() SELECTemployee_id,first_name,last_name,salary,AVG(salary) OVER() FROM employees ;定义…

网站添加链接如何创建微信公众号要钱吗

Threejs文字与css2d/css3d技术 学习ThreeJS的捷径学习之前先搞清楚自己想要什么样的效果贴图文字准备一张带文字的png贴图使用sprite来进行贴图实现2D始终面朝相机的文字使用planeGeometry来贴图实现3D文字使用planeGeometry来贴图实现伪3D文字动态贴图文字html2Canvas 文字几何…

网络公司品牌推广哈尔滨网站优化对策

下面是我翻译的关于帮助理解抽象类的例子。 这是一个例子帮助我们理解抽象类。在我看来这是一个非常简单的方法。让我们一起来看看下面的代码&#xff1a; <?php class Fruit { private $color; public function eat() { //chew } publi…

百度右侧相关网站西安做网站的公司哪家好

在Spring Cloud中&#xff0c;Gateway可以通过配置文件来实现负载均衡。以下是一个简单的配置示例&#xff0c;它演示了如何将请求代理到名为service-instance的服务的两个不同实例。 spring:cloud:gateway:routes:- id: service-instance-routeuri: lb://service-instancepre…

一级A做爰片安全网站长春关键词优化平台

展开全部步骤&#xff1a;1、设计总体中的N个个体编号。2、把号码写在号e68a84e8a2ad3231313335323631343130323136353331333431366366签上&#xff0c;将号签放在一个容器中搅拌均匀。3、每次从中抽取一个号签&#xff0c;连续不放回抽取n次。4、将取出的n个号签上所对应的n个…

做网站php与python商城网站建设目标

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题&#xff0c;尤其是我们需要进行开启自启动程序设置时出现诸多问题&#xff0c;于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序&#xff0c;并且是显式运行。 首先是打开…

wordpress 二级域名谷歌广告优化师

文章目录 一、 pom.xml依赖包二、yml配置文件三、消费者四、生产者总结 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 一、 pom.xml依赖包 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka<…

网站建设情况总结wordpress如何绑定域名

【关键字】 服务卡片、卡片跳转不同页面、卡片跳转页面携带参数 【写在前面】 本篇文章主要介绍开发服务卡片时&#xff0c;如何实现卡片点击跳转不同页面&#xff0c;并携带动态参数到js页面。在此篇文章“服务卡片 API6 JSUI跳转不同页面”中说明了如果跳转不同页面&#xf…

商家列表管理与公众号二维码绑定​,方便对用户进行消息通知提醒

gofly.v1kf.com vx: llike620 ​ ​​一、 核心业务流程​​​​管理员登录​​:管理员通过后台系统登录验证。​​查看商家列表​​:进入“商家管理”模块,以列表形式查看所有已注册的商家信息。​​生成绑定二维…

linux权限细化管理的三种方法:polkit sudoer doas做权限管理

场景 1:允许普通用户挂载外部USB驱动器 这个场景完美体现了从“命令控制”到“动作控制”的范式转变。 1. 使用 sudo / doas 实现(传统方式) 思路: 找到挂载命令(mount, udisksctl),授权用户执行它。sudo 配置 …

国产化Excel开发组件Spire.XLS教程:Python 写入 Excel 文件,数据写入自动化实用指南

Excel 是最常用的数据整理、分析和展示工具之一。在本文中,我们将介绍如何借助Spire.XLS使用 Python 将数据写入 Excel 文件,内容涵盖结构化数据插入、格式设置以及数据导出。文中示例所用库支持在代码中直接创建并自…

Ansible的安装和使用

一、安装 #安装源 # 1.安装 yum install epel-release -y yum install ansible -y# 2.生成公钥 [root@vm01 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/…

运城做网站推广网站的文案

今天安装软件&#xff0c;突然遇到了文件已损坏&#xff0c;扔到废纸篓的情况&#xff0c;于是搜索了下解决办法&#xff0c;跟大家分享下&#xff0c;希望对你有所帮助 一、检查安全性设置 打开【设置】-【隐私与安全】&#xff0c;下拉找到安全性&#xff0c;将安全性更改为…

晋城客运东站网站开发什么nas可以做网站服务器

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

网站建设培训哪里好网站建设与搜索引擎营销的关系

通常各种编程语言里&#xff0c;都有对应的各种线性代数库&#xff0c;我们可以利用现成的代数库来快速的求解我们想要的结果&#xff0c;也就是说&#xff0c;通过代数库&#xff0c;会让我们可以用更少的代码&#xff0c;更高的效率实现需求&#xff0c;这就是向量化的作用 …

政协机关网站建设wordpress在php什么版本号

BeanPostProcessor 接口是 Spring 框架中的一个扩展接口&#xff0c;用于在 Spring 容器实例化、配置和初始化 bean 的过程中提供自定义的扩展点。通过实现这个接口&#xff0c;您可以在 bean 实例创建的不同生命周期阶段插入自己的逻辑&#xff0c;从而实现对 bean 行为的定制…

网站建设中需求分析说明书国内平面设计公司

纠错码和压缩算法是同一枚硬币的两面。 两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反&#xff0c;他们会从消息或文件中移除冗余。 压缩和纠错并不是彼此抵消的&#xff0c;相反&#xff0c;好的压缩算法会移除抵消冗余&am…

wordpress网站被拒登郑州app拉新项目

能控性定义&#xff1a; 若给定系统的一个初始状态x(t0)&#xff08;t0可为0&#xff09;&#xff0c;若在t1>t0的有限时间区间[t0,t1]内&#xff0c;存在容许控制u(t)使得x(t1)0&#xff0c;则称系统状态在t0时刻是能控的。 若系统对任意一个初始状态都能控&#xff0c;则…