我是 scala/Lagom 的初学者,有人可以帮助我解决以下问题:
我正在尝试为产品字段创建一个 Api,为了做到这一点:我需要将扩展到名为 SmartJsonField 的特征的案例类与为 Api 创建的具有名为 Field 的特征的其他案例类进行映射
像这样 :
trait SmartJsonField {
type Typ
def name: String
def isRequired: Boolean
def validations: Set[ValidationKey]
}
case class Str(name: String, isRequired: Boolean = true, regex: Option[String], minLength: Option[Int], maxLength: Option[Int], validations: Set[ValidationKey] = Set()) extends SmartJsonField {
type Typ = String
lazy val optRegex: Option[Regex] = regex.map(_.r)
我想用这个特征的类来映射它
sealed trait Field
{
def isRequired : Boolean
def validations: Set[ValidationKeyApi]
}
case class FieldString(required : Boolean,
min : Option[Int], max : Option[Int], regex: Option[String], validations: Set[ValidationKeyApi]= Set()) extends Field // a field that takes a String value
{
override def isRequired = required
}
以下是我进行映射的方法:
def recursiveFieldMapping( fieldSchema : SmartJsonField) : Field = {
fieldSchema match {
case field: SmartJsonField.Str =>
FieldString(field.isRequired, field.minLength, field.maxLength, field.regex, field.validations)
}
}
它适用于除以下所有参数之外的参数字段验证,因为它不是来自同一类型:
required : Set[ValidationKeyApi]
found : Set[ValidationKey]
以下是案例类 ValidationKey 和 ValidationKeyApi:
case class ValidationKey(key: String, priority: Option[Int] = None)
case class ValidationKeyApi(key: String, priority: Option[Int] = None)
正如您所看到的,这是同样的事情,但由于我无法导入它们(Lagom 框架),所以我不知道如何继续。
答案1
发布 30 分钟后我找到了解决方案:
我只需要将新的案例类 ValiationKeyApi 与案例类 ValidationKey 进行映射,如下所示
FieldString(field.isRequired, field.minLength, field.maxLength, field.regex ,field.validations.map { ValidationKey =>
ValidationKeyApi(ValidationKey.key, ValidationKey.priority)
})