3

对于我的 android 应用程序,我使用 parceler 库和 lombok 库。

这些是我班级的注释:

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

但是,在 gradle build 期间,Parceler 抱怨没有默认的空构造函数。那么这是否意味着它无法识别@NoArgsConstructor注释并且这两者根本无法一起工作?因为例如 SugarORM 没有问题。还是我只是错过了什么?

4

3 回答 3

4

这涉及到 Lombok 如何将代码添加到您的课程中。Lombok 使用 Java 注释处理器中的一个已知技巧将代码添加到您的类。此添加的代码在注释处理器轮次期间对 Parceler 不可见,并使 Parceler 不知道添加的无参数构造函数。

我建议手动添加无参数构造函数,用@ParcelConstructor(我假设你有一个)注释现有构造函数,或者考虑使用具有注释的 Lombok fork Hrisey@Parcelable

我们最近对此有一个问题/疑问:https ://github.com/johncarl81/parceler/issues/177

于 2016-05-31T23:19:10.783 回答
1

编辑:在我做了一些清洁后,初始解决方案失败了,而且它也不适用于 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/main/resources/META-INF/services

第4步

在上面的目录中创建一个名为的文件javax.annotation.processing.Processor

第 5 步

编辑该文件,并添加以下行。

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

这是模块中所有可用注释处理器的声明。顺序显示 Lombok 注释处理器应该在 parceler 之前加载

第 6 步

现在我们有了“自定义注释处理器”,回到你的主应用程序模块,在你的 app 的 build.gradle 文件中,执行以下操作:

  • 删除 lombok 依赖项(annotatorProcessor,提供或编译)指令
  • 移除 parceler 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')
}

使用提供可确保注释处理器类不与您的应用程序捆绑在一起。


以下文章非常有帮助:

于 2018-01-05T12:49:07.520 回答
0

在构建空对象的静态方法上使用 @ParcelFactory:

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

这个技巧可以与 Jackson 和其他库一起使用,允许您在构造函数之外注释静态工厂方法。

于 2017-05-15T17:49:43.407 回答