Spring Boot POST接口返回空值及@RequestBody后Customer字段为空问题
问题1:初始提交字段全为null、预设数值返回0.0
产生原因
Controller层的CreateInvestment方法接收参数未添加@RequestBody注解,Spring MVC默认将参数按表单格式解析,你通过Postman提交的是JSON格式请求体,无法映射到Investment实体类的对应字段。仅Service层手动设置的accountNumber、status字段有值,其余字段为实体类初始化的默认值:引用类型为null,基础类型int默认值为0、float默认值为0.0。
解决方案
给Controller方法的Investment参数前添加@RequestBody注解,让Spring通过Jackson将JSON请求体反序列化到实体对象,即可正常填充提交的字段。
问题2:添加@RequestBody后关联Customer对象仅id有值、其余字段为null
产生原因
- 请求体字段名和实体类字段名不匹配:Investment实体类中关联Customer的属性名为
customer_id,但请求体中传的字段为customer,反序列化时只会将请求体中customer的id填充到临时生成的Customer对象中,其余未传字段自然为null。 - 未主动查询完整Customer数据:当前Service逻辑仅直接保存前端传过来的Investment对象,没有根据传入的customer id查询数据库中完整的Customer实体,保存时只会将customer id存入外键字段,返回的关联Customer对象还是前端传入的仅有id的空对象。同时你配置了
fetch = FetchType.LAZY懒加载策略,保存后直接返回时Hibernate不会主动查询Customer的其余字段。 - 常量初始化逻辑错误:你定义的
wht = 10/100、preLiquidationCharges = 25/100为整数除法,默认会得到0值,后续返回出现0.1、0.25是修复为浮点数除法后的结果。
解决方案
- 统一字段名:要么将Investment实体类的
customer_id属性改名为customer(符合常规命名规范),要么将请求体中的customer字段改为customer_id,保证JSON字段和实体属性名匹配。 - Service层补充查询逻辑:先根据传入的Customer id查询完整的Customer实体,再关联到Investment对象后保存,代码示例:
// 先注入CustomerRepository @Autowired private CustomerRepository customerRepository; public Investment CreateInvestment(Investment investment) { investment.setAccountNumber(nextAccountNumber()); investment.setStatus(InvestmentStatus.pending); // 查询完整客户信息 if (investment.getCustomer_id() != null && investment.getCustomer_id().getId() != null) { Customer customer = customerRepository.findById(investment.getCustomer_id().getId()) .orElseThrow(() -> new RuntimeException("对应客户不存在")); investment.setCustomer_id(customer); } return investmentRepository.save(investment); }
- 按需调整加载策略:如果该接口每次返回都需要完整Customer信息,可将关联配置的
fetch = FetchType.LAZY改为fetch = FetchType.EAGER,保存后Hibernate会自动加载关联的Customer全字段。 - 修正常量初始化:将常量赋值改为浮点数除法
wht = 10f/100、preLiquidationCharges = 25f/100,避免整数除法得到0值。
内容的提问来源于stack exchange,提问作者wizdemonizer
相关产品推荐
相关产品推荐

