mvn spring-boot:run报错找不到TemplateLineItemInput构造方法 IDE运行正常
问题根因
你遇到的报错核心是GraphQL反序列化框架无法实例化TemplateLineItemInput输入类,IDE运行正常、mvn spring-boot:run异常的差异来自两者的编译期注解处理逻辑有细微区别,本质是Lombok自动生成的构造函数不符合反序列化要求:
- 你的类同时使用了
@Data和@Builder注解,且所有字段都是final类型。@Builder默认会生成私有访问级别的全参构造函数,仅供给Builder模式调用,反序列化框架无法访问这个私有构造;同时你没有显式配置无参构造,框架找不到可用的实例化入口,就会抛出对应的错误。 - IDE内置的Lombok插件会自动调整构造函数的可见性适配运行场景,和纯Maven编译的产物逻辑不同,所以会出现两边表现不一致的情况。
解决方案
直接给输入类补充Lombok构造注解即可,有两种可选方案:
方案1(优先推荐)
显式生成公共全参构造,适配final字段的场景:
import lombok.Builder; import lombok.Data; import lombok.AllArgsConstructor; import java.math.BigDecimal; @Data @Builder(toBuilder = true) @AllArgsConstructor // 显式生成公共访问级别的全参构造 public class TemplateLineItemInput { private final String partMasterId; private final String partMasterIdPath; private final String actionType; private final BigDecimal actionQuantity; }
方案2(兼容需要无参构造的场景)
如果部分反序列化组件要求必须有无参构造,可额外增加强制无参构造注解:
import lombok.Builder; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.math.BigDecimal; @Data @Builder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor(force = true) // 强制给final字段生成默认null值的无参构造 public class TemplateLineItemInput { private final String partMasterId; private final String partMasterIdPath; private final String actionType; private final BigDecimal actionQuantity; }
验证步骤
修改完成后清理历史编译产物,重新启动即可:
mvn clean spring-boot:run
再执行对应的mutation请求就不会再报构造函数找不到的错误。
内容的提问来源于stack exchange,提问作者Bob Kuhar
相关产品推荐
相关产品推荐

