case类Java bean组合 - 以避免一些样板

时间:2015-02-18 03:09:37

标签: scala shapeless

我有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 classMyModel)并从case class成员中查找属性名称,并在setter上调用适当的javaModel Java bean。

我知道我可以使用Shapelesskeys获取所有case class(媒体资源名称),如下所示

val modelLabel = LabelledGeneric[MyModel]
val modelKeys = Keys[modelLabel.Repr].apply

现在我想知道是否有办法使用modelKey,例如当发现category时,mapping超过modelKeys时,请在set上调用适当的javaModel方法。例如对于category,它会调用setCategory,同样也会调用其他属性(这可能听起来很奇怪但最好不使用反射?)

0 个答案:

没有答案