2016-06-16 4 views
2

XML API 응답과 함께 2.0.2 버전을 사용해야합니다. 하지만 내 사용자 지정 XML 변환기는 절대로 호출되지 않습니다.Retrofit 2.0.2가 포함 된 사용자 정의 xml 변환기가 호출되지 않습니다

이 놀아 난 발견 : 나는 동일한 응답을 구문 분석 발리를 사용하는 경우, 동일한 사용자 지정 XML 컨버터라고

  • ;
  • 내 RestClient에 GsonConverterFactory를 적용하고 json 응답을 구문 분석하면 내 사용자 지정 JsonAdapter (@JsonAdapter (SomeAdapter.class))가 호출됩니다.

누구나 내 간단한 xml 변환기를 호출 할 수 있습니까? 내가 잘못한 일을하고 있거나 2.0.2를 개조하면 어떻게 든 간단한 xml 변환기를 지원하지 않습니다.

내 자바 클래스 I 응답 구문 분석 여기서 호출되지 않습니다

import org.simpleframework.xml.Element; 
import org.simpleframework.xml.convert.Convert; 

public class PassengerResponse { 
    @Element 
    @Convert(value = SomeConverter.class) 
    private String id; 
} 

사용자 지정 XML 컨버터 :

import org.simpleframework.xml.convert.Converter; 
import org.simpleframework.xml.stream.InputNode; 
import org.simpleframework.xml.stream.OutputNode; 

public class SomeConverter implements Converter<String> { 
    @Override 
    public String read(InputNode node) throws Exception { 
    return null; 
    } 

    @Override 
    public void write(OutputNode node, String value) throws Exception { 
    } 
} 

내 개조 위해 RESTClient :

import okhttp3.OkHttpClient; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.Retrofit; 
import retrofit2.converter.simplexml.SimpleXmlConverterFactory; 

public class RestClient2 { 
private UserApiJSON userPassengerApi; 
private static final int TIMEOUT = 120000; 
private static RestClient2 INSTANCE; 

public static RestClient2 getInstance() { 
    if (INSTANCE == null) { 
     INSTANCE = new RestClient2(); 
    } 
    return INSTANCE; 
} 

private RestClient2() { 

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

    OkHttpClient okHttpClient = new OkHttpClient(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(SimpleXmlConverterFactory.create()) 
      .client(okHttpClient.newBuilder().connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
        .readTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
        .writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
        .addInterceptor(loggingInterceptor) 
        .build()) 
      .build(); 

    userPassengerApi = retrofit.create(UserApiJSON.class); 
} 

public UserApiJSON getUserPassengerApi() { 
    return userPassengerApi; 
} 
} 

답변

1

사용자 정의 변환기를 사용하려면 사용자 정의 Converter.Factory을 생성해야합니다. 그리고 방법 addConverterFactory()을 사용하여 retrofit에 추가하십시오. 작업 예를 아래 :

public class StringConverterFactory extends Converter.Factory { 

public static StringConverterFactory create() { 
    return new StringConverterFactory(); 
} 

@Override 
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { 
    if (String.class.equals(type)) { 
     return new Converter<ResponseBody, String>() { 
      @Override 
      public String convert(ResponseBody value) throws IOException { 
       return value.string(); 
      } 
     }; 
    } 
    return null; 
} 
} 

그리고보다

는 개조이 여러 컨버터를 허용에서는이

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(SimpleXmlConverterFactory.create()) 
     .addConverterFactory(StringConverterFactory.create()) 
     .client(okHttpClient.newBuilder().connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
       .readTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
       .writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
       .addInterceptor(loggingInterceptor) 
       .build()) 
     .build(); 

을 개조 추가합니다. 제이크 와튼 (Jake Wharton)의 비디오는 Retrofit 2에 대해 이야기하고 있으며 다중 변환기와 같은 기능을합니다.

Retrofit 클래스 내부에서 실제로 SimpleXmlConverterFactory의 인스턴스를 만들 수있는 다른 방법을 가지고 적절한 Type

+0

고마워, 너는 나를 올바른 해결책으로 밀어 붙였다. – Andrew

5

을위한 컨버터를 반환하는 방법 nextRequestBodyConverter있다.) 당신이 필요로하는 모든 사용자 정의 Converer (들) 작업을 할 경우,을 다음 :

Strategy strategy = new AnnotationStrategy(); 
Serializer serializer = new Persister(strategy); 

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL) 
    .addConverterFactory(SimpleXmlConverterFactory.create(serializer)) 
    .client(okHttpClient.newBuilder().connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
    .readTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
    .writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS) 
    .addInterceptor(loggingInterceptor).build()) 
    .build(); 

참고 : 다른 변환기를 추가하면 순서가 변경됩니다. 왜? Jake Wharton 시계 presentation.

+0

그것은 나를 위해 작동합니다! – TiPo

+0

은 매력처럼 작동합니다. –

1
public UsStatesApi providesApi(){ 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 

     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     Strategy strategy = new AnnotationStrategy(); 

     Serializer serializer = new Persister(strategy); 

     OkHttpClient okHttpClient = new OkHttpClient.Builder() 
       .addInterceptor(interceptor) 
       .connectTimeout(2, TimeUnit.MINUTES) 
       .writeTimeout(2, TimeUnit.MINUTES) 
       .readTimeout(2, TimeUnit.MINUTES) 
       .build(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .addConverterFactory(SimpleXmlConverterFactory.create(serializer)) 
       .baseUrl("http://www.google.com") 
       .client(okHttpClient) 
       .build(); 

     return retrofit.create(UsStatesApi.class); 

    } 
관련 문제