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

Lombok @Data构造器生成机制及构造器使用冲突疑惑

问题原理解析

核心原因:Lombok构造器注解的优先级规则

当使用@Data时,它默认会自动生成@RequiredArgsConstructor——这个构造器会包含所有final字段和未初始化的非final字段。但Lombok有个关键规则:如果手动添加了任何构造器相关注解(比如@NoArgsConstructor),@Data默认的@RequiredArgsConstructor就不会自动生成了。

你的代码情况拆解

  1. 你给User类添加了@NoArgsConstructor(force = true),这个注解会生成一个无参构造器,同时覆盖了@Data自动生成带参构造器的行为。此时你的User类只有无参构造器,没有你调用new User(...)时需要的8参数构造器,因此会报错找不到对应构造方法。
  2. @NoArgsConstructor(force = true)里的force=true只是让Lombok能给final字段设置对应类型的默认值(比如String类型设为null),满足JPA对实体类无参构造的要求,但它不会帮你生成带参构造器。
  3. 当你手动添加@RequiredArgsConstructor后,Lombok会生成包含所有final字段的构造器(也就是你需要的8参数构造器)。此时User类同时拥有无参构造(满足JPA要求)和带参构造(满足你创建对象的需求),所以报错消失。

对应代码匹配逻辑

你的User类里的username、password、fullname等都是final字段,@RequiredArgsConstructor生成的构造器参数顺序和这些字段在类中的声明顺序完全一致,正好匹配你调用new User(username, passwordEncoder.encode(password), fullname, street, city, state, zip, phone)的参数列表(注:你代码里的phone应该对应类中的phoneNumber,属于笔误但不影响构造器匹配逻辑)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:38:26