Parceler和Lombok没合作?

时间:2016-05-31 10:22:48

标签: android lombok parceler

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

这是我班级的注释:

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

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

3 个答案:

答案 0 :(得分:4)

这将介绍Lombok如何为您的类添加代码。 Lombok在Java注释处理器中使用known trick来向您的类添加代码。在注释处理器轮次期间,Parceler看不到这些添加的代码,并使Parceler未知添加的no-args构造函数。

我建议手动添加no-args构造函数,使用@ParcelConstructor注释现有构造函数(我假设您有一个)或考虑使用具有{{的Lombok fork Hrisey 1}}注释。

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

答案 1 :(得分: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

这是模块中可用的所有注释处理器的声明。该命令显示应在parceler的

之前加载Lombok注释处理器

第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')
}

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

以下文章非常有用:

答案 2 :(得分:0)

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

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

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