2017-06-19 3 views
0

J'utilise scala 2.11.11, elastic4s 5.4.5 et elastic4s-Circé 5.4.5ne peut pas générer indexable pour un type contenant une carte avec un type personnalisé clé

import com.sksamuel.elastic4s.ElasticDsl._ 
import com.sksamuel.elastic4s.TcpClient 
import com.sksamuel.elastic4s.circe._ 
import io.circe.generic.auto._ 

object Test { 

    val client: TcpClient = ??? 

    case class Something(a: Map[AnotherThing, Int]) 
    case class AnotherThing(b: Int) 

    val smth = Something(Map.empty) 

    client.execute { 
    indexInto("index"/"type").doc(smth) 
    } 

} 

Ce ne serait pas compiler:

could not find implicit value for evidence parameter of type com.sksamuel.elastic4s.Indexable[net.lizeo.bd4m.storage.Test.Something] 
indexInto("index"/"type").doc(smth) 

Selon la documentation:

ajouter simplement l'importation pour votre bibliothèque choisie ci-dessous, puis avec les implicits de portée, vous pouvez maintenant passer un tapez vous aimez doc et un Indexable sera dérivé automatiquement.

Avec import io.circe.generic.auto._ et import com.sksamuel.elastic4s.circe._ pour elastic4s-Circé.

Qu'est-ce qui me manque?

+0

Avez-vous essayé d'utiliser un placier JSON différent. Vous ne devriez pas avoir de tels problèmes avec Jackson par exemple. – monkjack

Répondre

0

Vous devez définir le case classes en dehors de la portée de l'objet Test, c'est-à-dire en dehors de la classe Test. Vous pouvez également les définir en tant que classes distinctes.

façon donc correcte devrait être

import com.sksamuel.elastic4s.ElasticDsl._ 
import com.sksamuel.elastic4s.TcpClient 
import com.sksamuel.elastic4s.circe._ 
import io.circe.generic.auto._ 

object Test { 

    val client: TcpClient = ??? 

    val smth = Something(Map.empty) 

    client.execute { 
    indexInto("index"/"type").doc(smth) 
    } 

} 

case class Something(a: Map[AnotherThing, Int]) 
case class AnotherThing(b: Int) 
+0

cela ne fonctionne pas ... Et je ne comprends pas pourquoi cela pourrait fonctionner, le problème commence quand je mets une carte avec une clé personnalisée dans la classe de cas «Quelque chose» ie si j'essaie d'indexer une instance de 'AnotherThing' seulement, il compile. –