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

Quarkus+Kotlin实现通用API资源继承时遭遇无参合成构造器创建失败问题

解决Quarkus + Kotlin继承通用资源类时的代理错误

这个错误的核心原因是Quarkus无法为你的UserResource类生成代理,因为它不符合CDI bean的可代理要求,同时CDI尝试自动生成无参构造函数失败。具体来说有几个关键问题:

问题根源

  1. Kotlin类默认是final的,而Quarkus需要为JAX-RS资源/CDI bean生成代理类(用于拦截、依赖注入等),final类无法被继承生成代理。
  2. 构造函数没有显式添加@Inject注解,CDI无法识别该构造函数用于依赖注入,因此尝试生成一个无参的合成构造函数,但因为类不可代理(final)而失败。
  3. pom.xml里重复引入了quarkus-resteasy依赖,虽不是直接报错原因,但可能引发其他潜在问题。

解决方案

1. 让资源类支持代理(改为开放类)

将UserResource改为open类,允许Quarkus生成代理子类:

@ApplicationScoped
@Path("/users")
open class UserResource @Inject constructor(userRepository: UserRepository) : GenericResource<User>(userRepository)

2. 显式标注构造函数为@Inject

在父类GenericResource和子类UserResource的主构造函数上添加@Inject注解,告诉CDI使用这个构造函数进行依赖注入,避免它尝试生成无参构造:

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
open class GenericResource<T : Any> @Inject constructor(
    private val repository: PanacheRepository<T>
) {
    // ... 原有方法保持不变
}

3. 清理重复的依赖

删除pom.xml中重复的quarkus-resteasy依赖,修改后如下:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client-jackson</artifactId>
</dependency>

额外注意事项

  • 确保你的UserRepository是合法的CDI bean(比如标注了@ApplicationScoped或@Repository),这样才能被注入到UserResource中。
  • 不要给GenericResource添加@ApplicationScoped注解(除非你需要它作为独立bean),只在子类上标注即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:22:32