我的需求包含一个类,应该使用avro4s返回一个avro模式。下面是代码,我正在尝试:
我们的想法是实现这样的目标
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()我怎么才能解决这个问题?
com.sksamuel.avro4s.SchemaForT错误-找不到参数schemaFor: schemaFor的隐式值
Scala版本- 2.12.8
Avro4s - "com.sksamuel.avro4s“%%”avro4s-核心“% "3.1.1”
发布于 2020-06-18 19:52:18
我看到AvroUtil中的上下文绑定'T: AvroUtil‘信息导致了错误。
引用独立对象'AvroSchema‘的’apply AvroSchema‘方法(上面通过’AvroSchemaT‘调用):如果该方法没有提供参数值,而且编译器在作用域中没有找到隐式对象,那么默认情况下,将有一个隐式'SchemaForT’实例,将通过“Magnolia德里SchemaForT”特性创建:
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)
}https://stackoverflow.com/questions/62435865
复制相似问题