2016-08-15 122 views
1

我使用retrofit2進行網絡調用,並使用retrofit2 converter-simplexml作爲轉換器來解析XML。 有新聞網站:http://www.cbc.ca/cmlink/rss-topstories/與RSS訂閱源。無法修復錯誤。如何在Retrofit2 converter-simplexml中調試「java.lang.IllegalArgumentException:無法爲java.util.List創建轉換器」?

java.lang.IllegalArgumentException: Unable to create converter for java.util.List<com.ku4irka.rss_nfr.model.entity.Channel> 
                    for method ChannelService.getChannel 
                    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720) 
                    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:706) 
                    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:167) 
                    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) 
                    at retrofit2.Retrofit$1.invoke(Retrofit.java:145) 
                    at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
                    at $Proxy0.getChannel(Unknown Source) 
                    at com.ku4irka.rss_nfr.view.activity.ListNewsActivity.configRest(ListNewsActivity.java:48) 
                    at com.ku4irka.rss_nfr.view.activity.ListNewsActivity.onCreate(ListNewsActivity.java:36) 
                    at android.app.Activity.performCreate(Activity.java:5958) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
                     ... 10 more 
                    Caused by: java.lang.IllegalArgumentException: Could not locate ResponseBody converter for java.util.List<com.ku4irka.rss_nfr.model.entity.Channel>. 
                    Tried: 
                    * retrofit2.BuiltInConverters 
                    * retrofit2.converter.simplexml.SimpleXmlConverterFactory 
                    at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:346) 
                    at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:308) 
                    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:704) 
                     ... 20 more 

示例代碼:

RestManager:

public class RestManager { 

private static final OkHttpClient CLIENT = new OkHttpClient(); 

private static Retrofit retrofit; 

private static ChannelService sChannelService; 

private static void retrofitSetup() { 
    // Retrofit setup 
    retrofit = new Retrofit.Builder() 
      .baseUrl(Constans.HTTP.BASE_URL) 
      .addConverterFactory(SimpleXmlConverterFactory.create()) 
      .client(CLIENT) 
      .build(); 
} 


public static ChannelService getChannelService() { 
    if (sChannelService == null) { 

     retrofitSetup(); 
     // Service setup 
     sChannelService = retrofit.create(ChannelService.class); 
    } 
    return sChannelService; 
} 
} 

服務:

public interface ChannelService { 
@GET("cmlink/rss-topstories/") 
Call<List<Channel>> getChannel(); 
} 

類頻道:

@Root(name = "channel") 
public class Channel { 

@Element(name = "guid") 
private double id; 

@Element(name = "title") 
private String title; 

@Element(name = "pubDate") 
private String pubDate; 

@Element(name = "author") 
private String author; 

@Element(name = "description") 
private String description; 

@Element(name = "link") 
private String link; 

public Channel() { 
} 

方法:

private void configRest() { 
    Call<List<Channel>> call = mRestManager.getChannelService().getChannel(); 
    call.enqueue(new Callback<List<Channel>>() { 
     @Override 
     public void onResponse(Call<List<Channel>> call, Response<List<Channel>> response) { 

      if (response.isSuccessful()) { 
       mNewsList = response.body(); 
       setRecyclerView(); 
      } 
     } 
     @Override 
     public void onFailure(Call<List<Channel>> call, Throwable t) { 
      // 
     } 
    }); 
} 

搖籃:

configurations { 
    compile.exclude group: 'stax' 
    compile.exclude group: 'xpp3' 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:24.1.1' 
    compile 'com.android.support:design:24.1.1' 

    compile 'com.android.support:recyclerview-v7:24.1.1' 

    compile 'com.squareup.retrofit2:retrofit:2.1.0' 
    compile 'com.squareup.retrofit2:converter-simplexml:2.1.0' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.squareup.okhttp3:okhttp:3.3.1' 
compile 'org.simpleframework:simple-xml:2.7.1' 

} 

請告訴我是什麼問題?

+0

的版本,你可以檢查你的改造和SimpleXmlConverter的版本? –

+0

你看過[this](/ questions/32343183/retrofit-could-locate-converter-for-class-crashing-app)嗎? – Tibrogargan

回答

0

您可能正在使用轉換器的版本錯誤與改造

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.okhttp3:okhttp:3.4.0' 
compile ('com.squareup.retrofit2:converter-simplexml:2.1.0', { 
    exclude module: 'stax' 
    exclude module: 'stax-api' 
    exclude module: 'xpp3' 
}) 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(HOST) 
      .client(client) 
      .addConverterFactory(SimpleXmlConverterFactory.create()) 
      .build(); 
    service = retrofit.create(Service.class); 
+0

謝謝!在我的gradle文件中:'配置編譯.exclude組:'stax' compile.exclude組:'xpp3' } – ku4irka

+0

依賴項編譯fileTree(dir:'libs',include:['* .jar'] ) testCompile'junit:junit:4.12' compile'c​​om.android.support:appcompat-v7:24.1.1' compile'c​​om.android.support:design:24.1.1' compile'c​​om.android。 support:recyclerview -v7:24.1.1' compile'c​​om.squareup.retrofit2:retrofit:2.1.0' compile'c​​om.squareup.retrofit2:converter-simplexml:2.1.0' compile'c​​om.squareup。畢加索:畢加索:2.5.2' 編譯'com.squareup .okhttp3:okhttp:3.3.1' compile'org.simpleframework:simple-xml:2.7.1' } – ku4irka

相關問題