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) ... ...