Парселер и Ломбок не работают вместе?

Для своего приложения для Android я использую библиотеку parceler и библиотеку lombok.

Это аннотации моего класса:

@Table
@ToString
@Getter
@NoArgsConstructor
@Parcel
public class MyClass {

Однако во время сборки Gradle Parceler жалуется, что по умолчанию нет пустого конструктора. Значит ли это, что он не распознает@NoArgsConstructor аннотации и эти два просто не будут работать вместе? Потому что, например, У SugarORM нет проблем с этим. Или я просто что-то упустил?

Ответы на вопрос(3)

Решение Вопроса

Это объясняет, как Lombok добавляет код в ваш класс. Ломбок используетизвестный трюк в обработчике аннотаций Java для добавления кода в ваш класс. Этот добавленный код не виден Parceler во время цикла обработки аннотаций и делает добавленный конструктор без аргументов неизвестным Parceler.

Я бы порекомендовал добавить конструктор без аргументов вручную, аннотируя существующий конструктор@ParcelConstructor (Я предполагаю, что у вас есть) или рассмотрите возможность использования вилки LombokХрисей это имеет@Parcelable аннотаций.

У нас недавно была проблема / вопрос по этому поводу:https://github.com/johncarl81/parceler/issues/177

 John Ericksen01 июн. 2016 г., 16:31
Я сам этим не пользовался, но, похоже, сработает.
 ElyashivLavi07 февр. 2018 г., 11:23
Видимо, кажется, что Hrisey больше не поддерживается ...
 cherry-wave01 июн. 2016 г., 09:36
Приятно видеть кого-то из "посылок" напрямую; D Да, я догадался об этом. Я уже сделал конструктор без аргументов. Вы рекомендуете Hrisey? Это действительно объединит использование двух библиотек в одну.

создающего пустой объект:

@Builder
public class MyClass {
    @ParcelFactory
    static MyClass fromParcel() {
        return builder().build();
    }
}

Этот прием можно использовать с Джексоном и другими библиотеками, позволяя вам аннотировать статические фабричные методы в дополнение к конструкторам.

РЕДАКТИРОВАТЬ: Первоначальное решение не удалось после того, как я сделал некоторую очистку, также, он не работал с Proguard. Смотрите обновленное решение ниже.

Чтобы решить эту проблему, мне пришлось создать свой собственный процессор аннотаций. Идея этого процессора заключалась в том, чтобы обеспечить порядок процессоров для процессоров, используемых Lombok и Parceler.

Вот шаги, которые я выполнил, чтобы решить эту проблему:

Шаг 1

Создайте новый Java-модуль под корневым проектом. Назовите это любое имя, напримерparceler-lombok, используйте любое имя класса / пакет по вашему выбору.

Шаг 2

Добавьте классы аннотаций lombok и Parceler в качестве зависимости к новому модулю и установите совместимость с исходным кодом.

//File: parceler-lombok/build.gradle
apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.projectlombok:lombok:1.16.16'
    compile 'org.parceler:parceler:1.1.9'
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

Шаг 3

Создайте следующий каталог в вашей основной исходной папке для модуля:SRC / основные / ресурсы / META-INF / услуги

Шаг 4

Создайте файл с именемjavax.annotation.processing.Processor внутри каталога выше.

Шаг 5

Отредактируйте файл и добавьте следующие строки.

lombok.launch.AnnotationProcessorHider$AnnotationProcessor
lombok.launch.AnnotationProcessorHider$ClaimingProcessor
org.parceler.ParcelAnnotationProcessor

Это объявление всех процессоров аннотаций, доступных в вашем модуле. Порядок показывает, что процессоры аннотаций Lombok должны быть загружены до

Шаг 6

Теперь, когда у нас есть «пользовательский процессор аннотаций», вернитесь к основному модулю приложения, в файле build.gradle для приложения сделайте следующее:

Удалите директиву зависимости lombok (annotatorProcessor, предоставляется или компилируется)Удалите зависимость обработчика annotationProcessor (т.е.org.parceler:parceler), оставьте зависимость API как есть.Теперь добавьте ваш пользовательский процессор аннотаций в качестве зависимостиНаконец, убедитесь в совместимости с Java 1.7

Смотрите фрагменты ниже:

//File: app/build.gradle
android {
  //...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
  //...
}

dependencies {
    // ...
    //Remove these ones
    //provided 'org.projectlombok:lombok:1.16.16'
    //annotationProcessor 'org.parceler:parceler:1.1.9'

    //leave parceler API
    compile 'org.parceler:parceler-api:1.1.9'
    provided project(':parceler-lombok')
}

Использование при условии гарантирует, что классы процессора аннотаций не связаны с вашим приложением.

Следующие статьи были очень полезны:

https://medium.com/@emmasuzuki/annotation-processor-101-your-first-custom-annotation-a3db9ae48046https://academy.realm.io/posts/360andev-ryan-harter-eliminate-boilerplate/
 ElyashivLavi07 февр. 2018 г., 11:08
Не решил проблему для меня ...
 tlogbon10 февр. 2018 г., 12:51
Первоначальное решение не удалось, когда я попытался использовать Proguard. После нескольких часов исследований я смог решить проблему. Смотрите новое решение.

Ваш ответ на вопрос