Котлинские мутаторы

Я использую Ektorp как CouchDB «ORM», но этот вопрос кажется более общим, чем это. Может кто-нибудь объяснить, в чем разница между

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

а также

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

?

В первом случае Ektorp не жалуется, а на второе говорит:

 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) 

В дополнение к этому, если я это сделаю

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

Я получил:

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

Вопрос в том, каким образом первый фрагмент кода отличается от второго? В первом случае Ektorp «думает» есть мутатор, но не во втором …

Вот фрагмент кода, который, по-видимому, использует Ektorp при поиске метода (setId, setRevision).

 private Method findMethod(Class<?> clazz, String name, Class<?>... parameters) throws Exception { for (Method me : clazz.getDeclaredMethods()) { 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; } 

Разница заключается в том, как применение аннотаций к свойствам, определенным в классе, отличается от аннотирования свойств, объявленных в основном конструкторе.

См .: Аннотации Использование целевых мест использования в языковой ссылке:

Когда вы комментируете свойство или параметр первичного конструктора, есть несколько элементов Java, которые генерируются из соответствующего элемента Kotlin, и, следовательно, несколько возможных мест для аннотации в сгенерированном байт-коде Java.

Если вы не укажете цель использования сайта, цель будет выбрана в соответствии с аннотацией @Target используемой аннотации. Если имеется несколько применимых целей, используется первая применимая цель из следующего списка:

  • param
  • property
  • field

Итак, когда вы комментируете свойство, объявленное в основном конструкторе, это параметр конструктора, который по умолчанию получает аннотацию в байт-коде Java. Чтобы изменить это, укажите цель аннотации явно, например:

 abstract class AbstractEntity( @get:JsonProperty("_id") val id: String? = null, @get:JsonProperty("_rev") val revision: String? = null ) 
Interesting Posts

Классы хранения на языке программирования Kotlin

Проблемы, определяющие оператор equals ()

Ошибка Observable.combineLatest после обновления до RxJava 2.xx – не может выводиться тип

Тема и стиль Анко

Инициализация RecyclerView с привязкой данных Android в Котлине вызывает ошибку. Что я делаю не так?

Повторное включение будильника для точного в определенное время работы не работает

Что такое эквивалент Kotlin строки Java ?

Почему моя компиляция Kotlin не работает с помощью Kotlin-Maven-Plugin?

RequiresApi vs TargetApi андроид андроид

Как извлечь часть кода в локальные переменные в Kotlin при использовании построителя HTML Ktor?

Как использовать настраиваемые типы для параметров Retrofit @Query?

Обновление настроек уведомлений для Android-приложений

Моши в Android Kotlin – ENUM, поскольку ключ MutableMap преобразуется в String при его

Observable.just (), который возвращает Единицу в Котлин

есть ли ошибка в выбореKey.attachment () в java nio?

Давайте будем гением компьютера.