Spring boot JSON uName参数前端明明传了值后端接收不到

编程教程 > Java > Spring (66) 2025-04-12 09:24:59

问题环境

Spring 中首字母小写,第二个字母大写造成的参数问题

在进行前后端的联调时,有时候会出现,前端明明传了值,后端接口却接收不到的情况,这种情况常常让人很苦恼。已排除以下情况:

  • 参数名称错误
  • 接收json/form/body类型问题

都没发现什么问题。

 

问题关键代码

Controller 代码

@PostMapping(value = "/test")
public void test(@RequestBody UserVO userVO) {

    System.out.println("用户代码:" + userVO.getUCode());
    System.out.println("用户名称:" + userVO.getUName());
}

数据对象UserVO 

@Data
public class UserVO {

    /**
     * 用户代码
     */
    private Long uCode;

    /**
     * 用户名称
     */
    private String uName;

}

 

Postman 工具调试

Postman参数信息

Spring boot JSON uName参数前端明明传了值后端接收不到_图示-f6262e910712460688eae88e8de33389.png

控制台打印结果

用户代码:null
用户名称:null

 

原因分析

com.fasterxml.jackson.databind.util.BeanUtil类中的legacyManglePropertyName方法中

Spring boot JSON uName参数前端明明传了值后端接收不到_图示-deebaa2daf694a9f99af6e03aef53934.png

方法解析:

  • 根据入参offset去除get或者get,然后就剩下UName或者LoginType了
  • 然后从第一个字母开始解析,如果第一个字母是大写的,于是就将它转成小写,然后找下一个,如果还是大写,就继续转成小写,直到找到一个小写字母后,就把之后的字母(不管大小写)一起拼接进来。

所以:

  • uName 会被得到 uname
  • uCode 会被得到 ucode

然后根据得到的属性名去找get/set方法,想要找到setUname/setUcode的方法没找到。

没找到原因是:

然后我们这里的VO对象使用的是@Data注解生成的get/set方法,生成的方法参考:

Spring boot JSON uName参数前端明明传了值后端接收不到_图示-b21f4c9891824a37aeabb66e3b617a46.png

可以看到lombok插件这边生成的get/set方法名为

  • getUCode
  • setUCode
  • getUName
  • setUName

 

两个框架得到的不一样。导致了以上问题。

 

解决办法

改字段影响范围大情况

 

Jackson官方手段

  • 在单字母+单词驼峰的字段上添加Jackson的注解@JsonProperty
  • 或者手写get/set方法

 

取巧手段 - 字段private改为public

字段第一个字母小写第二个字母大写的属性,另一个解决办法就是把private改为public

@Data
public class UserVO {

    /**
     * 用户代码
     */
    public Long uCode;

    /**
     * 用户名称
     */
    public String uName;

}

原理:

在Jackson获取对象字段时候会调用 com.fasterxml.jackson.databind.introspectPOJOPropertiesCollector.collectAll() 方法

Spring boot JSON uName参数前端明明传了值后端接收不到_图示-e0e3e3d02b13450eb188a33540bd4820.png

上图部分会删除私有属性,也就是private标记的属性,所以这里改为public能解决。

改字段字段影响范围小情况(推荐)

直接改表字段名吧

避免单字母+单词驼峰设计,例如:

  • uName
  • uCode
  • uId

改为:

  • uname
  • ucode
  • uid

或者其他

 

 

注意

自然情况下(未加处理):对象里面的字段设计为uName样式,传递参数需要以uname方式传递,且返回对象的属性名也是uname,非Java对象里面的uName

 

参考文档

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
问题环境Spring 中首字母小写,第二个字母大写造成的参数问题在进行前后端的联调时,有时候会出现,前端明明传了值,后端接口却接收不到的情况,这种情况常常让人很
出现问题的环境springboot2.7.xjdk1.8请求方式Post参数格式FormDatakv防止特点:值特别大(类似富文本标签啥的内容特别多)问题排除FormDatakey和Contro...
本文主要说明在spring mvc框架中如何接收前端发过来的集合对象和相关的处理。主要讲解两种方式,form表单提交方式和ajax提交的方式
Spring Boot Enums枚举参数传递
springfox swagger 请求参数类型设置解析类:springfox.documentation.spring.web.readers.parameter.ParameterTypeR...
Spring MVC 5 接受对象集合参数实战,在之前,我一直以为http传输的参数是KEY-VALUE键值对的方式和文件流的形式。直到最近遇到新需求才知道还有一种RAW的数据类型。通过这种原生...
javascript中onclick事件传递对象参数,javascript,javascript传递对象参数
Spring boot 参数分组校验项目源码下载:demo-boot-group-validation.zip​​​​​​​ 访问密码:9987分组校验演示项目结构演示项目创建maven主要依赖...
通过之前的一些文章spring boot 2.3 hibernate validate框架未引入-xqlee (blog.xqlee.com)Spring boot 参数分组校验-xqlee (...
       ​Spring Boot       这里主要对Spring Boot 项目和Spring MVC 相关项目中,日期参数的使用以及Ajax请求日期数据返回格式的处理
解决spring security 整合到spring boot中,UserDetailsService接口的loadUserByUsername方法参数username输入为空问题。一  检查...
有些时候你可能会导出大量的JSON数据到文件中,或者说将所有数据导入到JSON文件。和任何大数据集一样,您不能只将其全部放入内存并将其写入文件。 它需要一段时间
前言Web项目开发一般接口入参都有校验需求,Vert.x 4 目前已有插件实现参数校验,引用之前的项目《Vert.x 4 Web应用初识》源码 引入验证插件ma
Form前置准备首先我们有一个表单<form id="params"&gtl; <input name="userName" value="123"&gtl; <...