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

无法持久化Purchase与purchase_book数据,遇参数校验异常

解决方案

1. 修复DTO字段绑定与类型问题

  • 字段名匹配检查:确保Postman请求JSON的字段名与PostPurchaseRequest DTO的字段名完全一致。例如DTO中是customerId,请求JSON里不能写成customer_id或CustomerID。如果需要支持下划线命名,在DTO字段上添加@JsonProperty注解:
    @JsonProperty("customer_id")
    private Long customerId;
    
  • 改用包装类类型:如果DTO中customerId/bookId是基本类型(如long/int),立即改为包装类(Long/Integer)。基本类型无法接收null值,当请求未传字段或传值为null时会触发类型转换异常:
    // 错误写法
    private long customerId;
    // 正确写法
    private Long customerId;
    

2. 确保Controller参数绑定正确

检查Controller的请求处理方法是否正确添加@RequestBody注解,否则Spring会将JSON参数解析为URL参数,导致无法获取字段值:

// 错误写法
public ResponseEntity<Purchase> createPurchase(@Valid PostPurchaseRequest request) {
// 正确写法
public ResponseEntity<Purchase> createPurchase(@Valid @RequestBody PostPurchaseRequest request) {
}

3. 校验规则与请求参数一致性

如果DTO中customerId/bookId添加了@NotNull/@NotEmpty等校验注解,必须确保Postman请求JSON中明确包含这两个字段且值不为null。例如正确的请求JSON应类似:

{
  "customerId": 1,
  "bookId": 2,
  // 其他业务字段...
}

若业务允许字段为空,可移除对应的校验注解。

4. 排查Mapper映射逻辑

检查DTO转实体的Mapper(如MapStruct、自定义Mapper)是否正确将customerId/bookId赋值给Purchase和PurchaseBook实体。例如MapStruct接口需确保映射规则覆盖这两个字段:

@Mapper(componentModel = "spring")
public interface PurchaseMapper {
    Purchase toPurchase(PostPurchaseRequest request);
    PurchaseBook toPurchaseBook(PostPurchaseRequest request);
}

若为自定义Mapper,需手动完成字段赋值:

Purchase purchase = new Purchase();
purchase.setCustomerId(request.getCustomerId());
// 其他实体字段赋值逻辑

5. 数据库约束验证

确认数据库中purchase表的customer_id、purchase_book表的book_id字段是否设置了非空约束。若实体对应字段为null,持久化时会触发数据库异常,需确保Mapper映射后实体字段不为null。

内容的提问来源于stack exchange,提问作者Fabio Luiz Vieira da Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:18