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

Quarkus原生镜像中Dozer映射器无法找到部分DTO构造方法求助

Quarkus原生镜像环境下Dozer映射器找不到DTO无参构造方法的解决办法

问题原因

报错提示找不到ServerPhysicalDto的无参构造方法,尽管代码中使用了Lombok的@NoArgsConstructor,但Quarkus基于GraalVM的原生镜像构建会进行代码裁剪优化,若构造方法未被直接引用,很可能会被移除;另外如果父类ServerDto缺少public无参构造,也会导致子类初始化失败。

解决步骤

1. 显式确保无参构造方法为public权限

修改Lombok注解,明确指定无参构造的访问权限为public,避免Lombok默认生成非public的构造方法:

@FieldDefaults(level = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PUBLIC) // 显式声明public无参构造
@AllArgsConstructor
@Setter
@Getter
public class ServerPhysicalDto extends ServerDto {

private static final long serialVersionUID = 1L;
Integer coreCount;
Boolean isMultiThreadSmt;
Integer maxSocket;
Long memoryMb;
Integer populatedSocket;
Integer procCount;
String procFrequency;
Integer threadPerCore;
}

2. 配置GraalVM反射元数据

Dozer依赖反射调用构造方法,Quarkus原生编译需明确保留相关类的反射信息,有两种方式:

  • 方式一:使用Quarkus注解自动配置
    直接在DTO类上添加@RegisterForReflection注解,让Quarkus自动生成反射配置:
@FieldDefaults(level = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Setter
@Getter
@RegisterForReflection // 添加该注解
public class ServerPhysicalDto extends ServerDto {
    // 原有代码
}
  • 方式二:手动添加反射配置文件
    在src/main/resources/META-INF/native-image/[你的groupId]/[你的artifactId]/reflection-config.json中添加配置:
[
  {
    "name": "fr.usu.server.dto.instance.server.ServerPhysicalDto",
    "allPublicConstructors": true,
    "allPublicMethods": true,
    "allPublicFields": true
  },
  {
    "name": "fr.usu.server.dto.instance.server.ServerDto",
    "allPublicConstructors": true
  }
]

3. 检查父类ServerDto的构造方法

确保父类ServerDto同样拥有public的无参构造方法,若父类使用Lombok,需添加@NoArgsConstructor(access = AccessLevel.PUBLIC)注解,否则子类无参构造无法正常调用父类构造。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:02