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

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 {
    @Bean
    public 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> {
    @Override
    public 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); 如果想要抛出异常。 否则,可以选择忽略。 

相关文章:

  • [NO-WX179]基于springboot+微信小程序的在线选课系统
  • msvcp140.dll是什么文件?修复丢失msvcp140.dll的方法指南
  • Python FastAPI 面试题及参考答案
  • [CLS] Token 在 ViT(Vision Transformer)中的作用与实现
  • 模拟算法专题
  • 机器学习实战,涉及数据预处理、监督算法、无监督算法、模型评估与改进-思维导图
  • 【2025年第三期】全国数字人才技能提升师资培训班邀请函
  • LangChain其它五类组件详解(6)—— 查询分析(Query analysis)
  • uni-app常用模板
  • Redis(Remote Dictionary Server)
  • C#更新Nginx SSL证书
  • nestjs 多环境配置
  • git 操作:撤销Merge
  • NOIP 2024 解题分析
  • nginx之gzip_static详解
  • Matplotlib查看 rc 参数的方法
  • JNI 本地方法调用 Java 静态方法 和 实例方法对比;通过本地方法创建 Java 对象;本地方法访问 Java 数组元素;本地方法错误返回给 Java
  • Linux Shell 基础操作笔记
  • charles接口测试(断点测试)
  • 本人设计的最完全的光压发电机模型
  • 春决火爆的背后,PEL如何做大这块电竞蛋糕
  • 照护者说|胡泳:向死而在,爱这个世界
  • 红星控股重整期间实控人被留置后续:重整草案不会修改,涉车建兴职责已调整
  • 电子凭证会计数据标准推广至全国
  • 新冠阳性率升高,专家:新冠变异株致病力没太多变化
  • 武汉警方通报一起故意伤害案件:1人死亡,嫌疑人已被抓获