avro4s: не удалось найти неявное значение для параметра schemaFor: com.sksamuel.avro4s.SchemaFor [T] - PullRequest
0 голосов
/ 17 июня 2020

Мое требование принимает класс и должно вернуть мне avro-схему с использованием avro4s . Ниже приведен код, я пытаюсь:

Идея состоит в том, чтобы добиться чего-то вроде этого


import scala.reflect.ClassTag
import com.sksamuel.avro4s.AvroSchema

case class Ingredient(name: String, sugar: Double, fat: Double)

case class Pizza(
    name: String,
    ingredients: Seq[Ingredient],
    vegetarian: Boolean,
    vegan: Boolean,
    calories: Int
)

class AvroUtil[T: ClassTag](implicit m: Manifest[T]) {

  def caseClassToAvroSchema() = {
    val schema = AvroSchema[T]
    schema
  }

}

new AvroUtil[Pizza].caseClassToAvroSchema()

Как я могу это исправить?

Ошибка - не удалось найти неявное значение для параметра schemaFor: com.sksamuel.avro4s.SchemaFor [T]

Scala Версия - 2.12.8

Avro4s - "com.sksamuel.avro4s "%%" avro4s-core "%" 3.1.1 "

1 Ответ

0 голосов
/ 18 июня 2020

Я вижу, что связанная с контекстом информация «[T: ClassTag]» в AvroUtil вызывает ошибку.

Ссылаясь на метод 'apply [T] (неявная schemaFor: SchemaFor [T])' автономного объекта 'AvroSchema' (выше вызывается через 'AvroSchema [T]'): если метод не снабжен параметром value, и компилятор не находит неявного объекта в области , тогда по умолчанию будет неявный экземпляр SchemaFor [T], который будет создан через трейт MagnoliaDerivedSchemaFors :

implicit def gen[T]: SchemaFor[T] = macro Magnolia.gen[T]

Информация, привязанная к контексту, воздерживается от создания этого объекта по умолчанию, и в результате вы получаете сообщение об ошибке. Похоже, что лучше использовать существующий метод применения автономного объекта AvroSchema, а не создавать новый класс. Другой способ - преобразовать AvroUtil в отдельный объект (что-то вроде кода ниже, который очень похож на AvroSchema) и использовать метод apply:

import com.sksamuel.avro4s.{AvroSchema, SchemaFor}
import org.apache.avro.Schema    

object AvroUtil {

      def apply[T](implicit schemaFor: SchemaFor[T]): Schema =
        AvroSchema[T](schemaFor)
    }
...