2011-03-17 2 views
0

xml과 json에서 항목을 제공하도록 RestHelper를 확장하는 클래스가 있습니다. 현재, 나는 XML로 엔티티를 반환하는 "역할"-method을 구현하고있다 :Scala + Lift + REST - serveJx로 배열 반환

object Rest extends RestHelper { 

serve { 

    case "supplier" :: "findAll" :: _ XmlGet _ 
     => supplierListToXml(Supplier.findAll) 

} 

def supplierListToXml(suppliers : List[Supplier]) = { 
    <suppliers>{suppliers.mapConserve(f=> f.toXml)}</suppliers> 
} 

}

내가 사용하여 수락 헤더에 따라, JSON의 aswell과 같은 항목을 제공 할 serveJx-method (http://www.assembla.com/wiki/show/liftweb/REST_Web_Services에서 설명).

클래스 공급자는 Convertable을 구현하고, 나는 나머지 클래스 내에서 변환 메소드를 구현 :

object RestApi extends RestHelper { 
implicit def cvt: JxCvtPF[Convertable] = { 
    case (JsonSelect, c, _) => c.toJson 
    case (XmlSelect, c, _) => c.toXml 
} 

serveJx { 
    case Get("2.0" :: "supplier" :: "head" :: _,_) 
     => Full(Supplier.findAll.head) 
} 

}

을 ... 그리고 이것은 내가 단일 공급 업체를 제공 할 때, 찾을 작동합니다. 그러나 공급 업체 목록 (목록 [Supplier])을 반환하려면 변환 방법을 적용 할 수 없습니다.

case Get("2.0" :: "supplier" :: "findAll" :: _,_) 
     => Full(Supplier.findAll.toList) 

... 내가 컴파일 오류를 얻을 :

"could not find implicit value for parameter cvt:com.mycompany.api.RestApi.JxCvtPF[ScalaObject]"

누군가가 나에게로 convertables의 목록을 변환 할 수 있도록 CVT-방법을 수정하는 방법의 예를 적어주세요 수 LiftResponse?

건배! /J

답변

1

나는 cvt- 방법에 대한 해결책을 찾았습니다. 특정 클래스를 일치시킬 수 있도록 형식을 암시 적 def cvt : JxCvtPF [Any]로 변경합니다.

//Generic list templates 
    case (JsonSelect, c : List[Convertable], _) => JArray(for{item <- c} yield item.toJson) 
    case (XmlSelect, c : List[Convertable], _) => <list>{c.mapConserve(f => f.toXml)}</list> 

전체 솔루션 :

object Rest extends RestHelper { 
implicit def cvt: JxCvtPF[Any] = { 

    //Generic list templates 
    case (JsonSelect, c : List[Convertable], _) => JArray(for{item <- c} yield item.toJson) 
    case (XmlSelect, c : List[Convertable], _) => <list>{c.mapConserve(f => f.toXml)}</list> 

    //Single-items of convertable 
    case (JsonSelect, c : Convertable, _) => c.toJson 
    case (XmlSelect, c : Convertable, _) => c.toXml 
} 
serveJx { 

    case "supplier" :: "findAll" :: _ Get _ 
     => Full(Supplier.findAll) 

    case "channelPackage" :: "findAll" :: _ Get _ 
     => Full(ChannelPackage.findAll) 

    case "channelPackage" :: "findFromSupplierId" :: supplierId :: _ Get _ 
     => Full(Supplier.find(supplierId).head.channelPackages) 

    case "device" :: "findAll" :: _ Get _ 
     => Full(Device.findAll) 

    case "device" :: "findFromSupplierId" :: supplierId :: _ Get _ 
     => Full(Supplier.find(supplierId).head.devices) 
} 

}

다음과 같은 convertables의 목록을 구현