Как создать JSON CustomTypeAdapter в Apollo GraphQL для Android с помощью Kotlin
Я изо всех сил пытаюсь выяснить, как добавить CustomTypeAdapter к моему ApolloClient.
Для мутации наш сервер ожидает ввода json. Соответствующее приложение для iOS передается в виде строки json.
Когда я передаю строку, я получаю сообщение, спрашивающее, забыл ли я добавить пользовательский тип.
Вот моя попытка:
build.gradle
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['JSON'] = "java.lang.JSONObject"
}
Вот где он создан.
val jsonCustomTypeAdapter = object : CustomTypeAdapter<JSONObject> {
override fun decode(value: CustomTypeValue<*>): JSONObject {
return JSONObject()
}
override fun encode(value: JSONObject): CustomTypeValue<*> {
return CustomTypeValue.GraphQLJsonString(value.toString())
}
}
mApolloClient = ApolloClient
.builder()
.serverUrl(baseUrl)
.addCustomTypeAdapter(jsonCustomTypeAdapter)
.normalizedCache(cacheFactory, CacheKeyResolver.DEFAULT)
.httpCache(ApolloHttpCache(cacheStore, null))
.okHttpClient(mHttpClient)
.build()
Похоже, что Apollo сгенерировал перечисление CustomType, реализующее ScalarType, но я не уверен, использовать его или нет.
@Generated("Apollo GraphQL")
public enum CustomType implements ScalarType {
JSON {
@Override
public String typeName() {
return "Json";
}
@Override
public Class javaType() {
return Object.class;
}
},
ID {
@Override
public String typeName() {
return "ID";
}
@Override
public Class javaType() {
return String.class;
}
}
}
Я попытался привести пример, приведенный на github apolloandroid, но он не сработал для меня, и это на Java, и после того, как я конвертирую его в Kotlin, он не компилируется.
Любые намеки или указания, чтобы следовать, будут оценены. Благодарю.
1 ответ
Оказывается, Аполлон автоматически сгенерировал тип, и все, что мне нужно было сделать, это правильно объявить его в build.gradle. Мне не нужно было добавлять какой-либо адаптер нестандартного типа в ApolloClient.
ПРИМЕЧАНИЕ. Тип Json был предоставлен нашим сервером.
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['Json'] = "java.lang.String"
}