i have simple finagle service follows:
import com.twitter.finagle.{http,service} import com.twitter.util.{await, future} import java.net.inetsocketaddress import org.jboss.netty.handler.codec.http._ import org.jboss.netty.buffer.channelbuffers.copiedbuffer import org.jboss.netty.util.charsetutil import net.liftweb.json._ import com.twitter.finagle.http.{request,response,richhttp} import com.twitter.finagle.builder.serverbuilder case class add(num1:int, num2:int) case class result(result:int) trait transformer[r1,t,u,r2] { def extractpayload(r:r1):t def responsepayload(u:u):r2 } object transformer{ implicit object addpayloadtransformer extends transformer[httprequest,add,result,httpresponse]{ implicit val formats = defaultformats def extractpayload(r:httprequest):add = { val body = r.getcontent val length = body.readablebytes() val bytes = new array[byte](length) body.getbytes(body.readerindex(),bytes,0,length) val bodystr = new string(bytes) parse(bodystr).extract[add] } def responsepayload(u:result):httpresponse = { val result = u.result val response = response(httpversion.http_1_1, httpresponsestatus.ok) response.setcontenttypejson() response.setcontentstring( s""" { "result": $result } """) response.httpresponse } } } object additionserver extends app transformer[httprequest,add,result,httpresponse]{ private def add(add:add):result = result(add.num1 + add.num2) private def additionhandler(req:httprequest): httpresponse = { val addpayload = extractpayload(req) val result = add(addpayload) responsepayload(result) } val service = new service[httprequest,httpresponse] { def apply(req: httprequest): future[httpresponse] = { future.value(additionhandler(req)) } } val server = http.serve(":8080", service) await.ready(server) println("started service") } when try compile it, following exception:
additionservice.scala:49: object creation impossible, since: [error] has 2 unimplemented members. [error] /** seen object additionserver, missing signatures follows. [error] * convenience, these usable stub implementations. [error] */ [error] def extractpayload(r: org.jboss.netty.handler.codec.http.httprequest): add = ??? [error] def responsepayload(u: result): org.jboss.netty.handler.codec.http.httpresponse = ??? [error] object additionserver extends app transformer[httprequest,add,result,httpresponse]{ [error] ^ [error] 1 error found [error] (compile:compileincremental) compilation failed to knowledge implementing traits proper signature.
can point out might going wrong here.
thanks
additionserver object extending transformer. in code, object not defining neither extractpayload nor responsepayload compilation error get.
you should move methods definitions trait companion object additionserver
object additionserver extends app transformer[httprequest,add,result,httpresponse] { import transformer._ def extractpayload(r:httprequest):add = { val body = r.getcontent val length = body.readablebytes() val bytes = new array[byte](length) body.getbytes(body.readerindex(),bytes,0,length) val bodystr = new string(bytes) parse(bodystr).extract[add] } def responsepayload(u:result):httpresponse = { val result = u.result val response = response(httpversion.http_1_1, httpresponsestatus.ok) response.setcontenttypejson() response.setcontentstring( s""" { "result": $result } """) response.httpresponse } } if you'd rather keep methods defined @ companion object can refer them additionserver:
object transformer{ implicit object addpayloadtransformer extends transformer[httprequest,add,result,httpresponse]{ implicit val formats = defaultformats def extractpayload(r:httprequest):add = { val body = r.getcontent val length = body.readablebytes() val bytes = new array[byte](length) body.getbytes(body.readerindex(),bytes,0,length) val bodystr = new string(bytes) parse(bodystr).extract[add] } def responsepayload(u:result):httpresponse = { val result = u.result val response = response(httpversion.http_1_1, httpresponsestatus.ok) response.setcontenttypejson() response.setcontentstring( s""" { "result": $result } """) response.httpresponse } } } object additionserver extends app transformer[httprequest,add,result,httpresponse]{ def extractpayload(r:httprequest):add = transformer.extractpayload(r) def responsepayload(u:result):httpresponse = transformer.responsepayload(u) ... ...