SpringBoot接收DTO参数全为null 插入数据库字段为空问题排查
问题诱因分析
该问题核心出在HTTP请求参数到DTO对象的绑定环节,和Service层持久化逻辑无关,常见诱因有3类:
- Controller接口方法的DTO参数未添加
@RequestBody注解:Spring MVC默认会将无注解的实体参数按表单参数、URL Query参数的规则解析,如果你在Postman中发送的是JSON格式请求体,Spring不会主动解析请求体内容反序列化为DTO对象,最终得到的CustomerDTO实例所有字段都是默认值null。这是该问题最高频的诱因。 - CustomerDTO类缺少必要的结构:DTO类没有无参构造方法、没有对应字段的Getter/Setter方法,会导致Spring反射创建DTO实例、给字段赋值时失败,最终所有字段为null。
- 请求配置或字段不匹配:Postman请求头未设置
Content-Type: application/json、请求体JSON的字段名和CustomerDTO类的属性名拼写/大小写不匹配,也会导致参数绑定失败。
解决方案
按优先级依次排查修复即可:
- 给Controller方法的DTO参数添加
@RequestBody注解,修正后的方法参考如下(注意不要遗漏自己配置的接口路径映射注解):
@PostMapping("/customer") public ResponseEntity<Customer> addCustomer(@RequestBody CustomerDTO customer) { try { System.out.println(customer.getEmail()+"000000000000000000000000"); Customer newCustomer = customerService .addCustomer(new Customer(customer.getSerialNumber(), customer.getFirstName(),customer.getLastName(),customer.getEmail(),customer.getMobileNumber())); System.out.println(customer.getEmail()+ "************************"); return new ResponseEntity<>(newCustomer, HttpStatus.CREATED); } catch (Exception e) { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } }
- 检查CustomerDTO类的定义:
- 必须保留无参构造方法:如果手动写了全参构造,一定要额外补充无参构造;如果使用Lombok简化代码,给类添加
@Data和@NoArgsConstructor注解即可自动生成无参构造、所有字段的Getter/Setter方法。 - 核对DTO内的属性名,确保和Postman传入的JSON字段名完全一致,比如
email字段不要写成Email、eMail,驼峰命名不要错写为下划线命名。
- 必须保留无参构造方法:如果手动写了全参构造,一定要额外补充无参构造;如果使用Lombok简化代码,给类添加
- 核对Postman请求配置:
- 请求方法和接口配置的方法一致(新增接口一般为POST)
- 请求头添加
Content-Type: application/json - 请求体选择
raw类型,下拉选项选JSON,传入的JSON结构参考:
{ "serialNumber": "CUST001", "firstName": "Renad", "lastName": "Sahal", "email": "renad@example.com", "mobileNumber": "13800000000" }
- 修正代码拼写隐患:Service层中持久层对象变量名
cutomerRepository存在拼写错误(正确拼写为customerRepository),避免后续因变量名不匹配出现Bean注入失败问题。
内容的提问来源于stack exchange,提问作者renad sahal
相关产品推荐
相关产品推荐

