首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avro4s :找不到参数schemaFor: com.sksamuel.avro4 s.SchemaFor[T]的隐式值

avro4s :找不到参数schemaFor: com.sksamuel.avro4 s.SchemaFor[T]的隐式值
EN

Stack Overflow用户
提问于 2020-06-17 18:23:31
回答 1查看 914关注 0票数 0

我的需求包含一个类,应该使用avro4s返回一个avro模式。下面是代码,我正在尝试:

我们的想法是实现这样的目标

代码语言:javascript
复制
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”

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 19:52:18

我看到AvroUtil中的上下文绑定'T: AvroUtil‘信息导致了错误。

引用独立对象'AvroSchema‘的’apply AvroSchema‘方法(上面通过’AvroSchemaT‘调用):如果该方法没有提供参数值,而且编译器在作用域中没有找到隐式对象,那么默认情况下,将有一个隐式'SchemaForT’实例,将通过“Magnolia德里SchemaForT”特性创建:

代码语言:javascript
复制
implicit def gen[T]: SchemaFor[T] = macro Magnolia.gen[T]

上下文绑定信息避免构造此默认对象,因此您将得到错误。使用现有的“AvroSchema”独立对象应用方法似乎很好,而不是拥有一个新的类。另一种方法是将“AvroUtil”转换为独立的对象(类似于下面的代码,与‘AvroSchema’非常相似),并使用apply方法:

代码语言:javascript
复制
import com.sksamuel.avro4s.{AvroSchema, SchemaFor}
import org.apache.avro.Schema    

object AvroUtil {

      def apply[T](implicit schemaFor: SchemaFor[T]): Schema =
        AvroSchema[T](schemaFor)
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62435865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档