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