SpringBoot 属性大写无法绑定

news/2024/11/17 13:24:52/

一、场景分析

假设有如下一个对象,它的三个属性全部大写。

java">package com.study.member.entity;
import lombok.Data;
@Data
public class Member {private String NAME;private Integer AGE;private String PHONE;
}

在使用 SpringMVC 进行接口调用的时候,会发现入参 member 的属性并没有正确绑定。

java">package com.study.member.controller;import com.study.member.entity.Member;
import com.study.common.base.R;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("member")
public class MemberController {@PostMapping("/register")public R<Void> register(@RequestBody Member member) {System.out.println(member);return R.success();}
}
-------------------------------------------------
POST http://localhost:8080/member/register
Content-Type: application/json{"NAME": "会员","AGE": 11,"PHONE": "12345678"
}
输出:
Member(NAME=null, AGE=null, PHONE=null)

 像这种属性全部大写的情况,也是我们平常可能会遇到的场景。

比如,这个接口是开放给第三方回调的,第三方回调的 JSON 报文 的对象属性并不一定都是严格的首字母小写驼峰格式。有时候跨语言系统的相互调用,这种情况就更常见了。

二、解决方案

在 Spring Boot 中,可以通过以下几种方式指定 JSON 填充的属性名称

1、使用 @JsonProperty 注解

在实体类的属性上使用 @JsonProperty 注解来指定在 JSON 中的属性名称。

java">package com.study.member.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class Member {@JsonProperty(value="NAME")private String NAME;@JsonProperty(value="AGE")private Integer AGE;@JsonProperty(value="PHONE")private String PHONE;
}
-------------------------------------------------
POST http://localhost:8080/member/register
Content-Type: application/json{"NAME": "会员","AGE": 11,"PHONE": "12345678"
}
输出:
Member(NAME=会员, AGE=11, PHONE=12345678)

当然,对象属性你也可以按首字母小写驼峰格式命名,jackson 也能正确绑定。

java">package com.study.member.entity;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Member {@JsonProperty(value="NAME")private String name;@JsonProperty(value="AGE")private Integer age;@JsonProperty(value="PHONE")private String phone;
}
-------------------------------------------------
POST http://localhost:8080/member/register
Content-Type: application/json{"NAME": "会员","AGE": 11,"PHONE": "12345678"
}
输出:
Member(name=会员, age=11, phone=12345678)

 不过,使用这个注解的话,在 JSON 数据反序列化时,使用的也还是 @JsonProperty 注解配置的名称:

java">package com.study.member.entity;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Member {@JsonProperty(value="NAME")private String name;@JsonProperty(value="AGE")private Integer age;@JsonProperty(value="PHONE")private String phone;
}
-------------------------------------------------
package com.study.member.controller;import com.study.member.entity.Member;
import com.study.common.base.R;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("member")
public class MemberController {@GetMapping("/findByName")public R<Member> findByName(String name) {Member member = new Member();member.setName(name);member.setAge(21);member.setPhone("456");return R.success(member);}
}
-------------------------------------------------
POST http://localhost:8080/member/findByName?name=小林
Content-Type: application/json输出:
{"code": 0,"msg": "success","data": {"NAME": "小林","AGE": 21,"PHONE": "456"}
}

 那如果希望对象JSON在反序列化的时候,不改变属性名称,那怎么办呢?使用 @JsonAlias 注解。

2、使用 @JsonAlias 注解

@JsonAlias 可以为属性提供一个或多个别名,在 JSON 处理时可以使用这些别名来填充属性。 

java">package com.study.member.entity;import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;@Data
public class Member {@JsonAlias({"NAME", "NICK_NAME"})private String name;@JsonAlias(value="AGE")private Integer age;@JsonAlias(value="PHONE")private String phone;
}
-------------------------------------------------
@RestController
@RequestMapping("member")
public class MemberController {@PostMapping("/register")public R<Void> register(@RequestBody Member member) {System.out.println(member);return R.success();}
}
-------------------------------------------------
###
POST http://localhost:8080/member/register
Content-Type: application/json{"NAME": "会员","NICK_NAME": "一心","AGE": 11,"PHONE": "12345678"
}
输出:
Member(name=一心, age=11, phone=12345678)

可以看到,有多个别名填充同一个属性时,按顺序填充,最后是 NICK_NAME 被填充进去。

这种方式,对象JSON在被反序列化时,并不改变属性名称。

java">@RestController
@RequestMapping("member")
public class MemberController {@GetMapping("/findByName")public R<Member> findByName(String name) {Member member = new Member();member.setName(name);member.setAge(21);member.setPhone("456");return R.success(member);}
}
-------------------------------------------------
GET http://localhost:5911/member/findByName?name=小王
Content-Type: application/json输出:
{"code": 0,"msg": "success","data": {"name": "小王","age": 21,"phone": "456"}
}


http://www.ppmy.cn/news/1531932.html

相关文章

GraphQL规范

GraphQL规范 内置类型内置指令自省 对IDEA插件GraphQL生成的规范的总结。详细规范文档请参阅GraphQL规范 内置类型 ID: 表示唯一标识符&#xff0c;通常用于对象的重取或缓存键。String: 表示文本数据&#xff0c;可读的字符串。Boolean&#xff1a;布尔Float:表示双精度浮点数…

智能BI项目第六期

本期任务 分析系统现在的不足分布式消息队列分布式消息队列 RabbitMQ 入门实战 系统现状不足分析总结 让我们来讨论一下单机系统的问题。 现状&#xff1a;我们的异步处理是通过本地线程池实现的。 但是存在以下问题&#xff1a; 无法集中限制&#xff0c;仅能单机限制&a…

網路本地連接沒有有效的IP配置:原因與解決方法

網路本地連接顯示“沒有有效的IP配置”。這通常意味著你的電腦無法從路由器或其他網路設備獲取有效的IP地址&#xff0c;從而導致無法上網。本文將從原因和解決方法兩個方面&#xff0c;詳細解析這個問題。 一、問題的原因 路由器或數據機問題&#xff1a; 路由器或數據機出…

H5 随机身份证号码、社会统一信用代码、手机号、名字、银行卡号码

平时注册可能会用到这些&#xff0c;原本用自己服务器搭了个&#xff0c;感觉纯前端的还能引入到项目中挺好的&#xff0c;之后再追加一些常用的随机数据&#xff0c;这样写表单应该就会好测试了(●’◡’●)。 在线链接 https://linyisonger.github.io/H5.Examples/?name./07…

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码

目录 1. RabbitMQ 核心概念 1.1生产者和消费者 1.2 Connection和Channel 1.3 Virtual host 1.4 Queue 1.5 Exchange 1.6 RabbitMO工作流程 2. AMQP 3.RabbitMO快速入门 3.1.引入依赖 3.2.编写生产者代码 ​3.3.编写消费者代码 4.源码 1. RabbitMQ 核心概念 在安装…

python的pyinstaller

1、pyinstaller --onefile -w *.py 可以生成可执行文件 -w就是不需要有console窗体出现、 2、 console窗体会出现一些警告。 比如 Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use: QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-scre…

使用Python实现图形学的环境映射算法

目录 使用Python实现图形学的环境映射算法引言1. 环境映射算法概述2. Python实现环境映射算法2.1 向量类2.2 环境纹理类2.3 材质类2.4 物体类2.5 环境映射器类2.6 使用示例 3. 实例分析4. 环境映射算法的优缺点4.1 优点4.2 缺点 5. 改进方向6. 应用场景结论 使用Python实现图形…

商家营销工具架构升级总结

今年以来&#xff0c;商家营销工具业务需求井喷&#xff0c;需求数量多且耗时都比较长&#xff0c;技术侧面临很大的压力。因此这篇文章主要讨论营销工具前端要如何应对这样大规模的业务需求。 问题拆解 我们核心面对的问题主要如下&#xff1a; 1. 人力有限 我们除了要支撑存量…