2016-05-31 31 views
3

對於我的android應用程序,我使用parceler庫和lombok庫。Parceler和Lombok不一起工作?

這是我班的註釋:

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

然而,gradle這個生成過程中,Parceler抱怨說沒有默認的空構造。那麼這是否意味着它不承認@NoArgsConstructor註釋,而這兩者根本不會一起工作?由於例如SugarORM沒有Probs。或者我只是想念一些東西?

回答

4

這將介紹Lombok如何爲您的課程添加代碼。 Lombok在Java註釋處理器中使用known trick將代碼添加到您的類中。這個添加的代碼在批註處理器中對Parceler不可見,並使添加的無參數構造器對Parceler不爲人知。

我建議你手動添加無參數的構造函數,註釋與@ParcelConstructor現有的構造函數(我假設你有一個),或考慮使用龍目叉Hrisey有一個@Parcelable註解。

我們有一個問題/關於這個問題最近:上一個靜態方法建立一個空的對象https://github.com/johncarl81/parceler/issues/177

+0

很高興看到有人從 「parcelers」 直接; d是啊,我猜到了。到現在爲止,我自己做了一個無參數構造函數。你推薦Hrisey嗎?它確實將兩個庫的使用合併爲一個。 –

+0

我自己並沒有使用它,但它看起來會做伎倆。 –

+0

顯然似乎Hrisey不再被維護... – ElyashivLavi

0

使用@ParcelFactory:

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

這一招可以用奔傑克遜和其他庫讓您使用除了構造函數之外還註釋靜態工廠方法。

0

編輯:初步解決方案失敗後,我做了一些清潔,也沒有與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 

這是模塊中可用的所有註釋處理器的聲明。訂單顯示,龍目島的註解處理器應該之前加載parceler的

步驟6

現在,我們有我們的「自定義註解處理器」,回到你的主應用程序模塊,爲您的build.gradle文件應用程序,請執行下列操作:

  • 刪除龍目島的依賴(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') 
} 

使用提供保證註解處理器類不捆綁你的應用。


以下文章是非常有益的:

+0

沒有爲我解決問題... – ElyashivLavi

+0

當我嘗試使用proguard時,初始解決方案失敗。經過數小時的研究,我能夠解決這個問題。查看新解決方案。 – tlogbon