I have a Play 2.3 project with custom headers coming from AJAX that need to be passed to every service call (to be passed further to the web services). I thought about making it an implicit parameter, like in this dumbed down example :
case class CriteriaHeaders(license: String) case class Criteria(criteriaHeaders: CriteriaHeaders, id: Int) class ProjectController(service: Service) { implicit def criteriaToCiteriaHeaders(criteria: Criteria): CriteriaHeaders = criteria.criteriaHeaders def findName(criteria: Criteria) = { // implicit val criteriaHeaders: CriteriaHeaders = criteria.criteriaHeaders service .findName(criteria.id) .fold( error => error, name => name ) } } class Service { def findName(id: Int) (implicit criteriaHeaders: CriteriaHeaders): Either[String, String] = ??? // TODO } (Of course in the real project there is an ActionBuilder, a Json parser etc.)
Usage :
val controller = new ProjectController(new Service()) val name = controller.findName(Criteria(CriteriaHeaders("abc"), 123)) It doesn't compile, giving an error :
Error:(21, 17) could not find implicit value for parameter licenseHeaders: A$A172.this.CriteriaHeaders.findName(criteria.id) However, if I uncomment the implicit val, it works. Why it doesn't work with the implicit method?
EDIT : In case anyone find this useful, I took second suggestion from @till-rohrmann and I put the implicit in the companion object of the CriteriaHeaders, so it is available in every controller using it.
object CriteriaHeaders { implicit def criteriaToCiteriaHeaders(implicit criteria: Criteria) = criteria.criteriaHeaders }
implicit def criteriaToCiteriaHeaders: CriteriaHeaders = criteria.criteriaHeadersinstead of theval?