Mutadores de Kotlin

Estoy usando Ektorp como CouchDB "ORM", pero esta pregunta parece ser más general que eso. ¿Podría alguien explicar cuál es la diferencia entre

@JsonInclude(NON_NULL) abstract class AbstractEntity( id: String?, revision: String? ) { @JsonProperty("_id") val id: String? = id @JsonProperty("_rev") val revision: String? = revision } 

y

 @JsonInclude(NON_NULL) abstract class AbstractEntity( @JsonProperty("_id") val id: String? = null, @JsonProperty("_rev") val revision: String? = null ) 

?

Para el primer caso, Ektorp no se queja pero por el segundo dice:

 org.ektorp.InvalidDocumentException: Cannot resolve revision mutator in class com.scherule.calendaring.domain.Meeting at org.ektorp.util.Documents$MethodAccessor.assertMethodFound(Documents.java:165) at org.ektorp.util.Documents$MethodAccessor.<init>(Documents.java:144) at org.ektorp.util.Documents.getAccessor(Documents.java:113) at org.ektorp.util.Documents.getRevision(Documents.java:77) at org.ektorp.util.Documents.isNew(Documents.java:85) 

Además de eso si lo hago

 @JsonInclude(NON_NULL) abstract class AbstractEntity( @JsonProperty("_id") var id: String? = null, @JsonProperty("_rev") var revision: String? = null ) 

Yo obtengo:

 org.ektorp.DbAccessException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "_id" (class com.scherule.calendaring.domain.Meeting), not marked as ignorable 

La pregunta es de qué forma el primer fragment de código es diferente del segundo? En el primer caso, Ektorp "piensa" que hay un mutador pero no en el segundo …

Aquí está el fragment de código que Ektorp parece usar al ubicar un método (setId, setRevision).

 private Method findMethod(Class<?> clazz, String name, Class<?>... parameters) throws Exception { for (Method me : clazz.getDeclanetworkingMethods()) { if (me.getName().equals(name) && me.getParameterTypes().length == parameters.length) { me.setAccessible(true); return me; } } return clazz.getSuperclass() != null ? findMethod( clazz.getSuperclass(), name, parameters) : null; } 

La diferencia es cómo la aplicación de las annotations a las properties definidas en el cuerpo de la class difiere de las properties de anotación declaradas en un constructor primario.

Consulte: Objetivos de sitio de uso de anotación en la reference de idioma:

Cuando anota una propiedad o un parámetro de constructor principal, hay múltiples elementos de Java que se generan a partir del elemento de Kotlin correspondiente y, por lo tanto, múltiples ubicaciones posibles para la anotación en el bytecode de Java generado.

Si no especifica un objective de sitio de uso, el objective se elige de acuerdo con la anotación @Target de la anotación que se utiliza. Si hay varios objectives aplicables, se utiliza el primer objective aplicable de la siguiente list:

  • param
  • property
  • field

Por lo tanto, cuando anota una propiedad declarada en un constructor primario, es el parámetro de constructor que obtiene de forma pnetworkingeterminada la anotación en el bytecode de Java. Para modificar eso, especifique el objective de la anotación explícitamente, por ejemplo:

 abstract class AbstractEntity( @get:JsonProperty("_id") val id: String? = null, @get:JsonProperty("_rev") val revision: String? = null ) 
  • NoSuchMethodError: java.lang.Long.hashCode
  • ¿Cómo tener un setter personalizado con verificación del parámetro de validez?
  • Modificador de visibilidad equivalente del package en Kotlin
  • Uso de Boolean? en si expresión
  • Tornadofx - controlando el object de la fila de la vista de tabla mientras construye
  • Vaadin 8 NativeSeleccione la representación de datos modificados de la list
  • Extender RxJava Observable en Kotlin con eliminación adecuada
  • ¿Puedo escribir sampleVideoView? = findViewById <VideoView> (R.id.videoView) en Kotlin?
  • Dagger 2 no reconoce el método de proporcionar en Kotlin. Java funciona bien
  • Cómo configurarOnEditorActionListener con Kotlin
  • especifique la class Kotlin como el punto de input de la class principal en MANIFEST.MF?