2012-09-04 2 views
1

내가 두 가지 일을 Scalatra와 작은 서비스를 썼다 어떻게 든 차단 -json, Excel - with apache스칼라 암시 적 변환은

기본적으로 ScalatraServlet 구현에 두 가지 방법을 썼습니다.

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 excel.Imports._을 가져 오는 경우

그때, import excel.Imports._import cc.spray.json._ 가져 오는 경우 scalac가 serveJson에 오류가 발생

(값 toJson하는 형식 매개 변수 T의 멤버가 아닌) , import cc.spray.json._ 인 경우 scalac은 serveExcel에 유사한 오류를 발생시킵니다 (값 toExcel은 매개 변수 T 유형의 값이 아님)

Surprisingl y, 수입품 중 하나만 사용하면 모든 것이 컴파일되고 잘 작동합니다 (절반은 주석으로 처리 했으므로 삭제 된 가져 오기를 사용합니다).

구현 방법에 문제가 있습니까?

링크 내가 참조로 사용 소스 - JSON 분무 : https://github.com/spray/spray-json/tree/master/src/main/scala/cc/spray/json

스칼라 버전 - 2.9.2 문제가 나는 것과 같은 암시 적 변환에 같은 이름을 사용하는 것 같다

답변

1

스프레이 - 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) 

간단한 이름 바꾸기로 문제가 해결되었습니다.

여전히 근본적인 문제는 보이지 않지만 컴파일시 그 결과를 보지 못한다. 내가 졸린 것 같아요.