Использование общего ресурса для выполнения вызовов API в Quarkus

#kotlin #resteasy #quarkus

Вопрос:

Я создаю приложение в Котлине и Кваркусе. Теперь я создал универсальный ресурс, который должен быть унаследован другими моими ресурсами, чтобы уменьшить избыточность кода. Когда мой пользовательский ресурс наследует общий источник, я получаю следующее сообщение:

 It's not possible to add a synthetic constructor with no parameters to the unproxyable bean class
 

Я совсем новичок в Котлине и Кваркусе, и когда я гуглю это конкретное сообщение об ошибке, я получаю только один результат старой ошибки в самом Кваркусе. Ниже приведены мои ресурсы пользователя и общие ресурсы:

 @ApplicationScoped
@Path("/users")
class UserResource(user: UserRepository): GenericResource<User>(user)
 
 @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
open class GenericResource<T : Any>(
    private var repository: PanacheRepository<T>
    ) {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    fun findAll() : PanacheQuery<T> = repository.findAll()

    @POST
    @Transactional
    fun add(
        @Valid resource: T
    ) : AddResponse =
        try {
            repository.persist(resource)
            AddSuccess(resource)
        } catch (e: Exception) {
            AddFailure(e)
        }

    @GET
    @Path("/{id}")
    fun findById(
        @PathParam("id")
        id : UUID
    ) : Uni<T> = repository.find("id", id).firstResult()

    @PUT
    @Transactional
    @Path("/{id}")
    fun update(
        @PathParam("id")
        id : UUID,
        resource: T
    ) : UpdateResponse =
        try {
            repository.persist(resource)
            UpdateSuccess(resource)
        } catch (e: Exception) {
            UpdateFailure(e)
        }

    @DELETE
    @Transactional
    @Path("/{id}")
    fun delete(
        @PathParam("id")
        id : UUID
    ) : DeleteResponse =
        try {
            repository.delete("id", id)
            DeleteSuccess("Deletion successful")
        } catch (e: Exception) {
            DeleteFailure(e)
        }

}
 

Это зависимости RESTeasy, которые я использую:

 <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy</artifactId>
</dependency>
<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>
 

Кто-нибудь знает, что я делаю не так?

Комментарии:

1. Когда я удаляю аннотацию ApplicationScoped из пользовательского ресурса, я получаю следующее сообщение об ошибке: Не удалось найти конструктор для класса: com.fortuneapp.backend.application.rest.UserResource

2. Какие зависимости RESTEasy вы используете?

3. @geoand, я обновил qn с помощью зависимостей RESTeasy.

4. Использование RESTEasy Reactive с Quarkus приводит к гораздо лучшей поддержке Kotlin. Пытаюсь меняться quarkusquarkus-resteasy* с quarkus-resteasy-reactive* и quarkus-rest-client с quarkus-rest-client-reactive*

5. Я добавил реактивные зависимости и переписал некоторый код, чтобы сделать его реактивным. К сожалению, я все еще получаю ошибку: javax.enterprise.inject.spi.DeploymentException: Невозможно добавить синтетический конструктор без параметров в непроксируемый класс компонентов: com.fortuneapp.backend.application.rest.UserResource. Я обновил свой код в qn с помощью реактивного кода.