【问题标题】:Retrofit 2 and GSON java.lang.IllegalArgumentException: Field map contained null value for key改造 2 和 GSON java.lang.IllegalArgumentException:字段映射包含键的空值
【发布时间】:2016-07-13 14:41:13
【问题描述】:

自从我从改造 1.9 迁移到 2.0

以来,每次执行服务器请求时都会遇到以下错误
java.lang.IllegalArgumentException: Field map contained null 
value for key 'installments'.

我调用的方法得到一个包含所有参数的 Map,如下代码:

@FormUrlEncoded
@POST("/api/method")
Call<Response<Payment>> pay(@FieldMap Map<String, String> fields);

但似乎每当我们有一个具有 NULL 值的条目时,它都会引发异常并且甚至不执行请求。

我们也在使用 Dagger 2。这就是使用 Converter.Factory 创建 GSON 的方式:

    @Provides
    @Singleton
    Converter.Factory provideGsonConverterFactory() {

       Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd hh:mm:ss")
                .setPrettyPrinting()
                .create();
       return GsonConverterFactory.create(gson);
    }

在迁移到 Retrofit 2.0 之前,我们没有遇到这个问题,这很奇怪。

确实,Jackson 有一个属性可以做到这一点:

      ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig
.Feature.WRITE_NULL_MAP_VALUES, false);

【问题讨论】:

  • 谁抛出这个错误,gson还是retrofit/okhhtp?
  • 一开始以为是GSON,后来发现是Retrofit。检查第208行github.com/square/retrofit/blob/master/retrofit/src/main/java/…
  • 顺便说一句,我仍然有兴趣知道如何做到这一点。
  • 这很奇怪。如果您想要修复它(并且如果他们同意应该修复它),您应该打开一个错误报告,然后您有两个选择:(1)在发送之前检查地图并删除空键/值条目. (2) 在使用 gson 将其发送到改造之前将地图转换为 json(这样您的 pay 方法将接受字符串而不是地图)
  • 我看不出这是一个正确的错误,因为他们正在检查它。如果是这样,我可以建议您了解有关@FieldMap 的更多信息。你是对的,我已经选择了选项(1),在调用之前我看不到其他方法来确定没有 NULL 条目。

标签: java android retrofit2 gson


【解决方案1】:

从 retrofit2 开始,任何地图(FiledMap、QueryMap、PartMap)都不接受空键或空值。见Document maps don't allow null anywhere.

【讨论】:

  • 感谢链接,这就是我们上面讨论的内容,没有文档。
  • 您的意思是除了@FieldMap 上明确说明您正在做的事情是不允许的文档之外,没有任何文档?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多