Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

179
Vistas
Las anotaciones esperadas multiplataforma de Kotlin devuelven `Esta clase no tiene un constructor` con el alias de tipo real de neo4j

Tengo un proyecto multiplataforma con una clase modal, Usuario.

Usuario.kt

 class User { val id = -1 val username = "" val age = -1 val nickname = "" }

También tengo anotaciones esperadas y reales.

Annotation.kt [Módulo común]

 expect annotation class NodeEntity expect annotation class Id expect annotation class GeneratedValue

Además, tengo su implementación real.

Annotation.kt [Módulo JVM]

 actual typealias ValueFor = org.neo4j.ogm.annotation.ValueFor actual typealias NodeEntity = org.neo4j.ogm.annotation.NodeEntity actual typealias Id = org.neo4j.ogm.annotation.Id actual typealias GeneratedValue = org.neo4j.ogm.annotation.GeneratedValue actual typealias Relationship = org.neo4j.ogm.annotation.Relationship

Luego volví y anoté mi User.kt

 @NodeEntity class User { @Id @GeneratedValue val id = -1 val username = "" val age = -1 val nickname = "" }

Pero cuando lo compilo, me sale este error.

 Task :compileKotlinJvm FAILED e: ...User.kt: (13, 2): This class does not have a constructor e: ...User.kt: (21, 6): This class does not have a constructor e: ...User.kt: (22, 6): This class does not have a constructor

¿Qué estoy haciendo mal?

NÓTESE BIEN. Intentos realizados

  • Hizo que las anotaciones esperadas tuvieran un constructor [sin éxito]
  • Hizo que las anotaciones esperadas coincidieran con un constructor [ERROR: el parámetro ''{0}'' tiene valores en conflicto en la anotación esperada y real]

FYI: Mi build.gradle ya tiene el noArg en su lugar, por lo que la clase User.kt se compila con un constructor público sin argumentos

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Sus anotaciones esperadas probablemente necesiten paréntesis explícitos.

 expect annotation class SharedImmutable()
 actual typealias SharedImmutable = kotlin.native.SharedImmutable

https://github.com/touchlab/Stately/blob/4b17057ad5d55f51f4ccf971cf79e51585ad2324/src/commonMain/kotlin/co/touchlab/stately/annotation/Annotations.kt#L26

over 4 years ago · Santiago Trujillo Denunciar

0

Experimenté un problema similar, pero aparentemente como el OP, ya incluí el paréntesis explícito. Mi problema particular tenía que ver con la biblioteca de Java, en el conjunto de fuentes de Java, que no estaba disponible para otro subproyecto de Gradle que dependía de él.

TL;DR

Comprueba que estás exponiendo correctamente las dependencias específicas de la plataforma. Por ejemplo, usar correctamente la implementation y la api en los archivos build.gradle .

Desarrollando mi escenario

Tuve una compilación de varios proyectos de Gradle:

 Project AppSubProject LibrarySubProject

Donde AppSubProject dependía de LibrarySubProject . Ambos subproyectos de Gradle eran módulos multiplataforma de Kotlin.

En LibrarySubProject , había una clase de anotación expuesta:

Conjunto de fuente común:

 expect annotation class Inject()

Conjunto de fuentes JVM:

 actual typealias Inject = javax.inject.Inject

La anotación Kotlin Common Inject estaba disponible para AppSubProject ya que dependía de LibrarySubProject .

Subproyecto de aplicación/build.gradle:

 ... commonMain { dependencies { implementation project(":LibrarySubProject") ...

La causa del problema

En el archivo LibrarySubProject/build.gradle no estaba exponiendo la dependencia de JVM:

 ... jvmMain { dependencies { implementation "javax.inject:javax.inject:1" ...

Como puede ver, estaba usando la implementation en lugar de api . Entonces, cuando usé la anotación en un constructor de una clase en AppSubProject :

 class Example @Inject constructor()

y cuando construí AppSubProject , no pudo resolver la dependencia de JVM y me estaba dando el siguiente error de forma críptica:

 e: Example.kt: This class does not have a constructor

La solución

La solución fue simplemente exponer la dependencia de JVM para que pudiera resolverse en el otro módulo. Entonces, cambiar la implementation a api resolvió el problema.

 ... jvmMain { dependencies { api "javax.inject:javax.inject:1" ...

Suma

Si experimenta este problema, afirme lo siguiente:

  • La clase de anotación común de Kotlin proporciona explícitamente el paréntesis del constructor como se indica en esta respuesta
  • Todas las dependencias necesarias específicas de la plataforma se exponen correctamente
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda