对于我的Android应用程序,我使用parceler库和lombok库。
这是我班级的注释:
@Table
@ToString
@Getter
@NoArgsConstructor
@Parcel
public class MyClass {
但是,在gradle构建期间,Parceler抱怨没有默认的空构造函数。那么这是否意味着它无法识别@NoArgsConstructor
注释,这两个根本不能一起工作?因为例如SugarORM没有它的probs。或者我错过了什么?
答案 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文件中,执行以下操作:
org.parceler:parceler
),保持API依赖性。请参阅以下代码段:
//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和其他库一起使用,除了构造函数之外,还允许您注释静态工厂方法。