You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目中xId无法赋值但xxId正常的原因咨询

问题分析与解决

问题描述

在Spring Boot项目中定义了如下请求类:

package com.example.demo.demos.service;

import lombok.Data;

@Data
public class CreateRequest {
    private String name;
    private String xId;
    private String xxId;
}

传递的JSON参数:

{
    "xId": "zzz",
    "xxId": "aaa",
    "name": "test"
}

但接收后xId的值为null,打印结果:

CreateRequest(name=test, xId=null, xxId=aaa)

Controller代码:

package com.example.demo.demos.web;

import com.example.demo.demos.service.CreateRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @PostMapping("/test")
    public void test(@RequestBody CreateRequest request) {
        System.out.println(request);
    }
}

仅当属性首字母为小写且第二个字母为大写时出现此问题,原因是什么?

原因解析

这是Lombok生成的Getter/Setter规则与Jackson的JSON字段匹配规则冲突导致的:

  • Lombok的@Data注解生成getter时遵循JavaBean规范:对于字段xId,生成的getter方法是getXId()(首字母小写的字段,会将第一个字母转为大写后加get前缀)。
  • Spring Boot默认使用Jackson处理JSON反序列化,Jackson解析getter方法的规则是:去掉get前缀后,若剩余部分首字母大写、第二个字母小写,会将首字母转为小写作为字段名;若剩余部分前两个字母均为大写,则直接保留原名称作为字段名。
  • 对于getXId(),Jackson会解析为字段名XId(首字母大写),但传入的JSON字段是xId(首字母小写),两者不匹配,因此无法完成赋值,导致xId为null。
  • 而xxId对应的getter是getXxId(),Jackson解析时发现前两个字母都是大写,直接将字段名识别为xxId,和JSON中的字段一致,所以能正常赋值。

解决方案

可以通过以下任意一种方式解决:

  1. 使用@JsonProperty注解指定字段名:
    在xId字段上添加注解,明确指定JSON对应的字段名:
    @Data
    public class CreateRequest {
        private String name;
        @JsonProperty("xId")
        private String xId;
        private String xxId;
    }
    
  2. 调整字段命名:
    遵循JavaBean推荐命名规范,将xId改为xid(全小写)或者x_id(下划线分隔),这样Lombok生成的getter是getXid()或getX_id(),Jackson能正确解析为对应的JSON字段。
  3. 配置Jackson的匹配规则:
    通过配置Jackson的MapperFeature.USE_STD_BEAN_NAMING,让其严格遵循JavaBean规范解析字段名,不过这种方式可能影响其他字段的序列化/反序列化,需谨慎使用。

内容的提问来源于stack exchange,提问作者Tony Zheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:57:46