2016-03-03 35 views
2

我希望有人能幫助我。Retrofit 2.0無法將請求正文轉換爲JSON

我嘗試使用Retrofit 2.0發送帶有JSON正文的POST請求。

接口:

public interface Interface { 
    @POST(/*path*/) 
    Call<MyResponseObject> sendInt(@Body MyInteger myInt); 
} 

MyInteger類:

public class MyInteger { 
    int id; 

    public MyInteger(int id) { 
     this.id = id; 
    } 
} 

MainActivity的部分:

private Retrofit mRetrofit = null; 
private final Interface mService; 
... 
... 
mRetrofit = new Retrofit.Builder() 
       .baseUrl(/*URL*/) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
mService = mRetrofit.create(Interface.class); 

召喚:

MyInteger id = new MyInteger(0); 
mService.sendInt(id).enqueue(new Callback<MyResponseObject>() { 
    @Override 
    public void onResponse(Call<MyResponseObject> call, Response<MyResponseObject> response) {/*Log something*/} 

    @Override 
    public void onFailure(Call<MyResponseObject> call, Throwable t) {} 
}); 

在我看來是這樣的例子: https://futurestud.io/blog/retrofit-send-objects-in-request-body

但GsonConverter不能MyInteger轉換成JSON .. 下面是日誌:

java.lang.IllegalArgumentException: Unable to create @Body converter for class com.??.MyInteger (parameter #1) 
                            for method Interface.sendInt 
... 
... 
Caused by: java.lang.IllegalArgumentException: Could not locate RequestBody converter for class com.??.MyInteger. 
                          Tried: 
                           * retrofit2.BuiltInConverters 
                           * retrofit2.GsonConverterFactory 
                           at retrofit2.Retrofit.nextRequestBodyConverter(Retrofit.java:288) 
                           at retrofit2.Retrofit.requestBodyConverter(Retrofit.java:248) 
                           at retrofit2.RequestFactoryParser.parseParameters(RequestFactoryParser.java:491) 
+0

我的解決方法是發送改裝的RequestBody對象,而不是我自己的myInteger的對象。 Gson gson = new Gson(); 字符串json = gson.toJson(myIntegerObject); RequestBody requestBody = RequestBody.create(MediaType.parse(「application/json」),josn); – nast

+0

您需要爲MyInteger類生成getter和setter,或者使int id爲public。 – vbp

回答

3

我有同樣的問題。根本原因是我使用的是不兼容的庫。

這種組合適用於我:現在

<dependency> 
     <groupId>com.squareup.retrofit2</groupId> 
     <artifactId>retrofit</artifactId> 
     <version>2.0.0-beta4</version> 
    </dependency> 
    <dependency> 
    <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.6.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.squareup.retrofit2</groupId> 
     <artifactId>converter-gson</artifactId> 
     <version>2.0.0-beta4</version> 
    </dependency> 
+0

我使用與gradle相同的依賴關係: compile'c​​om.squareup.retrofit2:retrofit:2.0.0-beta4' compile'c​​om.squareup.retrofit2:converter-gson:2.0.0-beta3' compile' com.google.code.gson:gson:2.6.2' – nast

+0

接下來我要做的是在調試器中逐步調試過程,並嘗試理解失敗的原因。您也可以在不同的環境中嘗試,例如使用較新的Java版本。我看不出你的代碼有什麼問題。 (但是,我是新的Retrofit,現在我正在同步使用它,因此不要將其作爲全面的代碼審查)。 – jgaa

+0

你救了我的一天! – Smiderle

相關問題