how to define optional path parameters in Play Framework routes

summerNight

I have the following overloaded functions to match my routes file

  def getMessage() = getMessage(None, None, None)
  def getMessage(campaignID: Option[String]) = getMessage(campaignID, None, None)
  def getMessage(campaignID: Option[String], revision: Option[Int]) = getMessage(campaignID, revision, None)
  def getMessage(campaignID: Option[String], revision: Option[Int], transactionID: Option[Int] ) = Action.async { implicit request =>

    db.getDocument(campaignID, revision, transactionID)
    .map(result =>
    Ok(Json.toJson(result))).recover {case ex: IOException => InternalServerError("Please install MongoDB")}
  }

Here's my routes file:

GET     /message                                                          controllers.Application.getMessage()
GET     /message/:campaignID                                              controllers.Application.getMessage(campaignID:String)
GET     /message/:campaignID/:revision                                    controllers.Application.getMessage(campaignID:String, revision:Int)
GET     /message/:campaignID/:revision/:transactionID                     controllers.Application.getMessage(campaignID:String, revision:Int, transactionID:Int)

How do I make it work so that campaignID, revision and transactionID are completely optional on the REST call? Right now, I am receiving the following error:

[error] /Users/superman/conf/routes:9: Compilation error[Using different overloaded methods is not allowed. If you are using a single method in combination with default parameters, make sure you declare them all explicitly.]
[error] GET     /message/:campaignID                                              controllers.Application.getMessage(campaignID:String)
[error]                                                                           ^
[error] (compile:playRoutes) @6oo852mf7: Compilation error in /Users/superman/conf/routes:9
[error] - application - 

! @6oo852mf7 - Internal server error, for (GET) [/message/A/1/124] ->

play.sbt.routes.RoutesCompilationException: Compilation error[Using different overloaded methods is not allowed. If you are using a single method in combination with default parameters, make sure you declare them all explicitly.]
        at play.sbt.routes.RoutesCompiler$$anonfun$9.apply(RoutesCompiler.scala:152) ~[na:na]
        at play.sbt.routes.RoutesCompiler$$anonfun$9.apply(RoutesCompiler.scala:150) ~[na:na]
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library-2.11.6.jar:na]
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library-2.11.6.jar:na]
        at scala.collection.immutable.List.foreach(List.scala:318) ~[scala-library-2.11.6.jar:na]
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) ~[scala-library-2.11.6.jar:na]
        at scala.collection.AbstractTraversable.map(Traversable.scala:105) ~[scala-library-2.11.6.jar:na]
        at play.sbt.routes.RoutesCompiler$.compileRoutes(RoutesCompiler.scala:150) ~[na:na]
        at play.sbt.routes.RoutesCompiler$$anonfun$4.apply(RoutesCompiler.scala:127) ~[na:na]
        at play.sbt.routes.RoutesCompiler$$anonfun$4.apply(RoutesCompiler.scala:126) ~[na:na]
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47) ~[scala-library-2.11.6.jar:na]
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40) ~[na:na]
        at sbt.std.Transform$$anon$4.work(System.scala:63) ~[na:na]
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) ~[na:na]
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) ~[na:na]
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17) ~[na:na]
        at sbt.Execute.work(Execute.scala:235) ~[na:na]
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) ~[na:na]
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) ~[na:na]
        at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159) ~[na:na]
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:28) ~[na:na]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_60]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_60]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_60]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_60]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
marcospereira

You need only a single method in your controller, like this:

package controllers

import play.api.mvc._

class Application extends Controller {

  def options(id:Long, revision: Int, transaction: Int) = Action {
    Ok(views.html.index(s"id: $id, revision: $revision, transaction: $transaction"))
  }
}

And then you can declare your routes like this:

GET     /options                              controllers.Application.options(id:Long = 1, revision:Int = 2, transaction:Int = 3)
GET     /options/:id                          controllers.Application.options(id:Long, revision:Int = 2, transaction:Int = 3)
GET     /options/:id/:revision                controllers.Application.options(id:Long, revision:Int, transaction:Int = 3)
GET     /options/:id/:revision/:transaction   controllers.Application.options(id:Long, revision:Int, transaction:Int)

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

How to validate optional query parameters in Play Framework?

From Dev

Using POST routes parameters in Play Framework

From Dev

Using POST routes parameters in Play Framework

From Dev

Reverse routing with optional GET parameters in Play Framework

From Dev

Routes with optional parameters in Suave

From Dev

How to define an optional parameter in path using swagger

From Dev

How to "rewrite" urls or routes with Play Framework 2

From Dev

How do I define an optional parameter in my Laravel routes?

From Dev

Play framework routes

From Dev

Play Framework: How to define a writable object in scala?

From Dev

How to define multiple values in routes from a view template in Play 2

From Dev

How to define url routes with wildcard in Play2?

From Dev

Laravel routes with multiple optional parameters

From Dev

Add scope with optional parameters to routes

From Dev

Slim Framework: How to catch multiple fully OPTIONAL routes?

From Dev

Freya - How to define a Uri Template with Optional Query String Parameters

From Dev

How to define optional parameters (dependencies) in the @Bean method in Spring?

From Dev

Play framework 2 : How to pass object between routes, views, and controller?

From Dev

How to use imports and implicits in Play Framework's routes file?

From Dev

play framework - bind enum in routes

From Dev

Play Framework, REST, Routes, and Controllers

From Dev

Scala backticks in Play Framework Routes

From Dev

Domain routes in Play Framework 2.3

From Dev

Play Framework Error in Routes file

From Dev

Jersey (JAX-RS) how to map path with multiple optional parameters

From Dev

Django reverse routes - two optional parameters

From Dev

Django reverse routes - two optional parameters

From Dev

Angular Lazy Routes and optional matrix parameters

From Dev

Optional named parameter in Play Framework

Related Related

  1. 1

    How to validate optional query parameters in Play Framework?

  2. 2

    Using POST routes parameters in Play Framework

  3. 3

    Using POST routes parameters in Play Framework

  4. 4

    Reverse routing with optional GET parameters in Play Framework

  5. 5

    Routes with optional parameters in Suave

  6. 6

    How to define an optional parameter in path using swagger

  7. 7

    How to "rewrite" urls or routes with Play Framework 2

  8. 8

    How do I define an optional parameter in my Laravel routes?

  9. 9

    Play framework routes

  10. 10

    Play Framework: How to define a writable object in scala?

  11. 11

    How to define multiple values in routes from a view template in Play 2

  12. 12

    How to define url routes with wildcard in Play2?

  13. 13

    Laravel routes with multiple optional parameters

  14. 14

    Add scope with optional parameters to routes

  15. 15

    Slim Framework: How to catch multiple fully OPTIONAL routes?

  16. 16

    Freya - How to define a Uri Template with Optional Query String Parameters

  17. 17

    How to define optional parameters (dependencies) in the @Bean method in Spring?

  18. 18

    Play framework 2 : How to pass object between routes, views, and controller?

  19. 19

    How to use imports and implicits in Play Framework's routes file?

  20. 20

    play framework - bind enum in routes

  21. 21

    Play Framework, REST, Routes, and Controllers

  22. 22

    Scala backticks in Play Framework Routes

  23. 23

    Domain routes in Play Framework 2.3

  24. 24

    Play Framework Error in Routes file

  25. 25

    Jersey (JAX-RS) how to map path with multiple optional parameters

  26. 26

    Django reverse routes - two optional parameters

  27. 27

    Django reverse routes - two optional parameters

  28. 28

    Angular Lazy Routes and optional matrix parameters

  29. 29

    Optional named parameter in Play Framework

HotTag

Archive