对于我的android应用程序,我使用parceler库和lombok库。
下面是我们班的注释:
@Table
@ToString
@Getter
@NoArgsConstructor
@Parcel
public class MyClass {然而,在gradle构建过程中,Parceler抱怨没有默认的空构造函数。那么,这是否意味着它不承认@NoArgsConstructor注释,这两个注释根本就不能一起工作?因为,例如,SugarORM与它没有任何问题。还是我只是遗漏了什么?
发布于 2016-05-31 23:19:10
这涉及到Lombok如何向类添加代码。Lombok使用Java注释处理器中的已知诡计向类添加代码。这个添加的代码在批注处理器循环期间对Parceler是不可见的,并且使Parceler不知道添加的no-args构造函数。
我建议手动添加no-args构造函数,用@ParcelConstructor注释现有的构造函数(假设您有),或者考虑使用具有@Parcelable注释的lombok叉格里西。
我们最近遇到了一个问题:https://github.com/johncarl81/parceler/issues/177
发布于 2018-01-05 12:49:07
编辑:在我做了一些清理之后,初始解决方案失败了,而且,它也不适用于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/services
步骤4
在上面的目录中创建一个名为javax.annotation.processing.Processor的文件。
步骤5
编辑该文件,并添加以下行。
lombok.launch.AnnotationProcessorHider$AnnotationProcessor
lombok.launch.AnnotationProcessorHider$ClaimingProcessor
org.parceler.ParcelAnnotationProcessor这是模块中可用的所有注释处理器的声明。顺序显示,Lombok注释处理器应该在parceler之前加载
步骤6
现在我们有了“自定义注释处理器”,回到应用程序的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')
}使用提供确保注释处理器类不与您的应用程序捆绑在一起。
以下文章非常有用:
发布于 2017-05-15 17:49:43
在构建空对象的静态方法上使用@ParcelFactory:
@Builder
public class MyClass {
@ParcelFactory
static MyClass fromParcel() {
return builder().build();
}
}这个技巧可以与Jackson和其他库一起使用,除了构造函数之外,还允许您注释静态工厂方法。
https://stackoverflow.com/questions/37543057
复制相似问题