springboot body 转对象强验证属性多余属性抛错误

在Spring Boot中,当使用@RequestBody注解来接收HTTP请求中的JSON数据并将其转换为Java对象时,Spring默认会忽略额外的属性。这意味着如果发送的JSON包含一些目标对象中没有定义的属性,Spring不会报错,这些额外的属性会被简单地忽略。

例如,假设有一个Java对象User,如下所示:

    private String name;private int age;// getters and setters
}

如果发送一个包含name和age以及额外属性email的JSON到Spring Boot应用,Spring会正常地将name和age映射到User对象,而email属性会被忽略:

{"name": "John","age": 30,"email": "john@example.com"
}

如果希望Spring在接收到包含未知属性的JSON时抛出错误,可以使用以下几种方法:

1. 使用@Validated和@JsonIgnoreProperties(ignoreUnknown = false)
可以通过自定义一个配置或者使用一个专门的类来处理JSON反序列化时的行为。例如,可以创建一个配置类来全局设置Jackson的属性忽略行为:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {return builder.createXmlMapper(false).build().setConfig(builder.createXmlMapper(false).build().getDeserializationConfig().with(builder.deserializationConfig().with(builder.deserializationConfig().with(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true))));}
}

2. 使用@JsonIgnoreProperties注解
在控制器方法参数上使用@JsonIgnoreProperties(ignoreUnknown = false)来强制要求所有未知属性都抛出异常:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;@RestController
public class UserController {@PostMapping("/users")public User createUser(@RequestBody @JsonIgnoreProperties(ignoreUnknown = false) User user) {// 处理用户创建逻辑...return user;}
}

3. 使用自定义的转换器或反序列化器
创建一个自定义的反序列化器,并在其中显式地检查未知属性并抛出异常:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import org.springframework.boot.jackson.JsonComponent;@JsonComponent
public class CustomUserDeserializer extends JsonDeserializer<User> {@Overridepublic User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {JsonNode node = p.getCodec().readTree(p);if (!node.isObject()) {throw new IOException("Expected JSON object, but got " + node);} else {Iterator<Map.Entry<String, JsonNode>> fields = node.fields();User user = new User();while (fields.hasNext()) {Map.Entry<String, JsonNode> entry = fields.next();String fieldName = entry.getKey();if ("name".equals(fieldName) || "age".equals(fieldName)) { // 只允许这些字段存在,忽略其他所有字段。如果需要更复杂的行为,请根据需要调整此逻辑。// 设置user的属性...例如: user.setName(entry.getValue().asText()); 等等。 确保处理所有可能的字段。 否则,抛出异常或忽略。 例如: 抛出 new RuntimeException("Unknown property: " + fieldName); 如果想要抛出异常。 否则,可以选择忽略。 

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

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

相关文章

01. Linux嵌入式系统学习笔记(一)(linux基础指令)

一. linux基础操作指令 1. 新建文件和目录 (1) 新建文件 touch 命令&#xff1a;用于创建空文件。 touch filename.txt 如果文件已存在&#xff0c;touch 会更新文件的访问时间和修改时间。 (2) 新建目录 mkdir 命令&#xff1a;用于创建目录。 mkdir directoryname 使…

Java 列表复制与对象引用

Java 列表复制与对象引用 一、知识点 1. 对象引用的基本概念 在 Java 中&#xff0c;List<School> 这样的集合存储的并不是真正的对象&#xff0c;而是对象的“地址”&#xff08;引用&#xff09;。就好比你有一个文件柜&#xff0c;文件柜里放的不是文件本身&#x…

如何理解 Apache Iceberg 与湖仓一体(Lakehouse)?

一、什么是湖仓一体&#xff08;Lakehouse&#xff09;&#xff1f; 湖仓一体是一种融合了数据湖的灵活存储能力与数据仓库的高效分析功能的现代数据架构。它通过整合两者的优势&#xff0c;解决了传统架构的局限性&#xff0c;为企业数据处理提供了更全面的解决方案。 数据湖…

Android面试总结之Android RecyclerView:从基础机制到缓存优化

引言 在 Android 开发中&#xff0c;RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例&#xff0c;带你深入理解RecyclerView的工作原理与优化策略。 核心组件 RecyclerView&#xff1a;作为容器视图&am…

【鸿蒙开发】Hi3861学习笔记- TCP客户端

00. 目录 文章目录 00. 目录01. TCP概述02. TCP应用场景03. TCP和UDP比较04. TCP相关API05. TCP编程流程06. 硬件设计07. 软件设计08. 实验现象09. 附录 01. TCP概述 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接、可靠的传输层协议&#xff0c;旨…

【负载均衡系列】Keepalive

一、Keepalived 的核心功能 Keepalived 是一款用于实现 ​高可用(HA)​ 和 ​负载均衡 的开源工具,核心基于 ​VRRP(Virtual Router Redundancy Protocol)​ 协议,工作在网络四层(传输层)和七层(应用层)。 主要用途: 通过虚拟IP(VIP)实现服务高可用(主备切换)。…

2025-03-25 学习记录--C/C++-PTA 习题9-3 平面向量加法

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题9-3 平面向量加法 本题要求编写程序&#xff0c;计算两个二维平面向量的和向量。 输入格式: ❀ 输入在…

23种设计模式-桥接(Bridge)设计模式

桥接设计模式 &#x1f6a9;什么是桥接设计模式&#xff1f;&#x1f6a9;桥接设计模式的特点&#x1f6a9;桥接设计模式的结构&#x1f6a9;桥接设计模式的优缺点&#x1f6a9;桥接设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是桥接设计模式…

python:music21 构建 LSTM+GAN 模型生成爵士风格音乐

keras_lstm_gan_midi.py 这是一个结合 LSTM 和 GAN 生成爵士风格音乐的完整Python脚本。这个实现包含音乐特征提取、对抗训练机制和MIDI生成功能&#xff1a; import numpy as np from music21 import converter, instrument, note, chord, stream from tensorflow.keras.mode…

go:前后端分离

1.前端代码 新建一个前端文件夹&#xff0c;在该文件夹下新建一个.html文件&#xff0c;写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下&#xff1a; func main() { // 服务运行提示 fmt.Println("go web server is runn…

大数据学习(86)-Zookeeper去中心化调度

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

HTML5 拖放(Drag and Drop)学习笔记

一、HTML5 拖放简介 HTML5 拖放&#xff08;Drag and Drop&#xff09;是HTML5标准的一部分&#xff0c;允许用户抓取一个对象并将其拖动到另一个位置。拖放功能在现代网页中非常常见&#xff0c;例如文件上传、任务管理、布局调整等场景。 HTML5 拖放功能支持以下浏览器&…

文件I/O--C++的文件操作

一、打开文件&#xff0c;从文件中读取、写入文件 从文件中读取数据&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以这句可以省略&#xff0c;现在不能了 using namespace std;i…

Redis GEO 命令详解:轻松实现“附近的人“功能

目录 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

NIO入门

IO和NIO的区别&#xff1a; IO&#xff1a;通过流处理数据&#xff0c;仅支持阻塞IO。 核心组件&#xff1a;InputStream /OutputStream用于字节的读写&#xff0c;Reader / Writer&#xff1a;用于字符流的读写。读取过程中无法被中断&#xff0c;是阻塞式IO。 NIO:通过管道处…

基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本家庭装修管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Node.js语言进行编写&#xff0c;使用了VUE框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户的功能包括&#xff1a;注册、登录、浏览首页…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数&#xff0c;主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

LangGraph 怎么控制递归次数

这一节我们讲讲langgraph图的递归限制 Recursion Limit&#xff0c;递归限制设置了图在单次执行过程中可以执行的最大超级步骤数。一旦达到该限制&#xff0c;LangGraph 将引发 GraphRecursionError 错误。默认情况下&#xff0c;此值设置为 25 步。递归限制可以在运行时为任何…