我有case class
这样的
case class MyModel(category:Option[String],deploymentId:Option[String],key:Option[String],metaInfo:Option[String],name:Option[String],version:Option[Int],tenantId:Option[String])
有一个Java库,我们的应用程序与之交互,返回Java Bean。现在,很多时候必须从MyModel
case class
填充Java Bean,例如
val javaModel = repositoryService.newModel()
myModel.category.map(javaModel.setCategory(_))
myModel.deploymentId.map(javaModel.setDeploymentId(_))
myModel.key.map(javaModel.setKey(_))
myModel.metaInfo.map(javaModel.setMetaInfo(_))
myModel.name.map(javaModel.setName(_))
myModel.tenantId.map(javaModel.setTenantId(_))
myModel.version.map(javaModel.setVersion(_))
repositoryService.saveModel(javaModel)
以上是缩短代码段,但MyModel
中的大量其他属性与javaModel
相对应,它变得相当精彩。我试图提出一个泛型函数,它遍历case class
(MyModel
)并从case class
成员中查找属性名称,并在setter
上调用适当的javaModel
Java bean。
我知道我可以使用Shapeless从keys
获取所有case class
(媒体资源名称),如下所示
val modelLabel = LabelledGeneric[MyModel]
val modelKeys = Keys[modelLabel.Repr].apply
现在我想知道是否有办法使用modelKey
,例如当发现category
时,mapping
超过modelKeys
时,请在set
上调用适当的javaModel
方法。例如对于category
,它会调用setCategory
,同样也会调用其他属性(这可能听起来很奇怪但最好不使用反射?)