1

Scalatraを使用して、次の2つのことを行う小さなサービスを作成しました。

  • JSONデータを提供する
  • Excelシートと同じデータを提供する

JSONはspray-json、Excelで実行されます-apachePOIを使用

基本的に、ScalatraServletの実装で2つのメソッドを作成しました。

def serveJson[T: JsonWriter](data: T) = {
  contentType = "text/json"
  data.toJson.prettyPrint
}

def serveExcel[T: ExcelWriter](data: T) = {
  contentType = "application/excel"
  data.toExcel.getBytes
}

ここでは、toJsonはspray-jsonで実装されているため、JsonWriterの暗黙的な変換を提供します。そこで、私は同様のExcel変換を作成することにしました。

// ExcelWriter.scala

package com.example.app.excel

import org.apache.poi.hssf.usermodel.HSSFWorkbook
import annotation.implicitNotFound

@implicitNotFound(msg = "Cannot find ExcelWriter type class for ${T}")
trait ExcelWriter[T] {
  def write(obj: T): HSSFWorkbook
}

object ExcelWriter {
  implicit def func2Writer[T](f: T => HSSFWorkbook): ExcelWriter[T] = new ExcelWriter[T] {
    def write(obj: T) = f(obj)
  }
}


// Imports.scala
package com.example.app.excel

import org.apache.poi.hssf.usermodel.HSSFWorkbook

object Imports {

  type ExcelWriter[T] = com.example.app.excel.ExcelWriter[T]
  implicit def pimpAny[T](any: T) = new AnyExcelPimp(any)
  private[excel] class AnyExcelPimp[T](any: T) {
    def toExcel(implicit writer: ExcelWriter[T]): HSSFWorkbook = writer.write(any)
  }

}

さて、問題は次のとおりです。

をインポートimport cc.spray.json._するとimport excel.Imports._、scalacはエラーをスローしますserveJson(値toJsonはタイプパラメーターTのメンバーではありません)

をインポートimport excel.Imports._するとimport cc.spray.json._、scalacは同様のエラーをスローしますserveExcel(値toExcelはタイプパラメーターTのメンバーではありません)

驚いたことに、インポートの1つだけを使用すると、すべてがコンパイルされて正常に機能します(半分はコメントアウトしているので、削除されたインポートを使用します)。

私の実装の何が問題になっていますか?

参照として使用したspray-jsonソースへのリンク:https ://github.com/spray/spray-json/tree/master/src/main/scala/cc/spray/json

Scalaバージョン-2.9.2

4

1 に答える 1

1

問題は、spray-jsonで使用されているものと同じ名前を暗黙の変換に使用したことのようですpimpAny

// my implicit
implicit def pimpAny[T: ExcelWriter](any: T) = new AnyExcelPimp(any)

// spray-json implicit
implicit def pimpAny[T](any: T) = new PimpedAny(any)

したがって、単純な名前変更で問題が解決しました。

それでも、根本的な問題ではなく、コンパイル時の結果が表示されるのはちょっと奇妙です。私は眠くなると思います...

于 2012-09-04T19:57:27.940 に答える