【问题标题】:transform Scala case class to org.apache.solr.common.SolrInputDocument将 Scala 案例类转换为 org.apache.solr.common.SolrInputDocument
【发布时间】:2014-12-18 08:43:08
【问题描述】:

是否有任何通用实现可以将 Scala 案例类转换为 SolrDocument ?

由于我找不到任何可以重复使用的映射器实用程序,因此我采用了以下方法:

  1. 创建案例类对象
  2. 通过将案例类对象转换为 Map 来获取非空字段
  3. 向可变文档逐一添加字段。

这种方法对我有用,但我必须创建中间 Map 对象。出于冗长和复杂的原因,我想避免这种情况。有没有更好的方法?

【问题讨论】:

  • 这个问题的答案有一个不错的小案例类来映射函数,您可以修改它以返回 SolrDocument stackoverflow.com/a/1227643/47496
  • @Noah 谢谢,我知道了。如您所见,该答案还涉及创建 Map,Map[String, Any] => 最大的反模式之一,我不想污染我的代码库。正如我所提到的,我想知道是否有任何更好的实用程序不涉及此中间 Map 对象的构造。

标签: java scala solr datamapper case-class


【解决方案1】:

不是一个完整的答案(我会在评论中写下这个,但需要更多的代表),但只要你指出一个方向,宏就是以类型安全的方式执行此操作而无需编写样板的方法每个案例类的映射函数。 JSON 库处理相同的问题(除了将 SolrDocument 替换为 JSON 对象)。作为示例,您可以查看 Play Framework 中的 JSON 序列化器/反序列化器宏实现:

https://github.com/playframework/playframework/blob/master/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala

我怀疑这个解决方案比你想要的要重一些。我处理它的方法是为每个案例类编写愚蠢的样板映射函数,并且只有在这成为重大负担时才走宏路径。

【讨论】:

    【解决方案2】:

    修改these 答案之一似乎相当简单:

      def getSolrDoc(cc: Product): SolrDocument = {
        val solrDoc = new SolrDocument
        cc.getClass.getDeclaredFields.foreach { f =>
          f.setAccessible(true)
          solrDoc.addField(f.getName, f.get(cc))
        }
        solrDoc
      }
    

    及用法:

      case class X(a:Int, b:String)
      val x = X(1, "Test")
      val doc = getSolrDoc(x)
      println(doc) // prints SolrDocument{a=1, b=Test}
    

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多