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
相关产品推荐
相关产品推荐

