【问题标题】:Retrofit: Custom ConverterFactory only for response改造:自定义 ConverterFactory 仅用于响应
【发布时间】:2017-04-05 10:47:05
【问题描述】:

我有一个来自服务器的通用响应:

{
  "Error": null,
  "Data": {}
  }
}

所以我创建了一个自定义转换器工厂,只获取Data 中的对象。

主要思想是改变:

  • 这个Call<ResponseBase<List<Item>>> getItems();
  • Call<List<Item>> getItems();

它对响应很有效,但是当我尝试使用@Body发送请求和反对请求时,转换器崩溃了...

java.lang.IllegalArgumentException: Unable to create @Body converter for class <package>.data.entities.request.RequestLogin (parameter #1)
...     
Caused by: java.lang.IllegalArgumentException: Could not locate RequestBody converter for class <package>.data.entities.request.RequestLogin.
        Tried:
             * retrofit2.BuiltInConverters
             * <package>.data.api.ResponseConverterFactory

这是我的自定义Converter.Factory

class ResponseConverterFactory extends Converter.Factory {

    // constructor

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(final Type type, Annotation[] annotations, Retrofit retrofit) {
        Type wrappedType = new ParameterizedType() {
            @Override
            public Type[] getActualTypeArguments() {
                return new Type[] {type};
            }

            @Override
            public Type getOwnerType() {
                return null;
            }

            @Override
            public Type getRawType() {
                return ResponseBase.class; // GENERIC CLASS
            }
        };

        Converter<ResponseBody, ?> converter = factory.responseBodyConverter(wrappedType, annotations, retrofit);
        return new ResponseConverter(converter);
    }

}

如何让它使用默认转换器进行请求序列化?

【问题讨论】:

    标签: android gson retrofit2


    【解决方案1】:

    好的...简单的解决方案是覆盖requestBodyConverter

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return factory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
    }
    

    factory 是在构造函数上设置的全局变量(GsonConverterFactory)

    【讨论】:

    • 谢谢。我面临同样的问题 - 创建自定义 Factory.Converter 但忘记实现这种方法时。这就是为什么在运行时,我收到错误“无法为类创建@Body 转换器”。
    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2023-03-21
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多