Play framework routes, and scala predef values

强颜欢笑 提交于 2019-12-03 14:02:13

问题


I develop application on play framework 2.2 I have a routes file like this:

GET  /posting/          controllers.posting.BlogController.allPosts()
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

And BlogContriller:

object BlogController extends Controller {

  def allPosts(pageNumber:Int = 1, postsPerPage:Int = 10) = Action{
    val posts = Post.getLastNPosts(postsPerPage, postsPerPage*(pageNumber-1))
    val htmlPosts = new Html(new StringBuilder());

    for (post <- posts){
      val htmlPost = views.html.posting.post(post.getName, post.getText, post.getDate.toString)
      htmlPosts += htmlPost;
    }

    Ok(views.html.posting.index(htmlPosts))
  }
}

When I try to comile that, I give a error:

Error:(14, -1) Play 2 Compiler:  C:\...\conf\routes:14: 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.]
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

And I can't understand how to fix that. Can anyone help me?


回答1:


You can must use parameter with default value:

GET  /posting/          controllers.posting.BlogController.allPosts(number: Int = 1)
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

You may not use overloaded methods allPosts(Int) and allPosts. Since you declared allPosts with two parameters with default values, Scala sees this method as 4 different methods. You may only use one of them.




回答2:


You must have all the parameters defined for same function. In your case allPosts. Give a default value for routes where you don't need that parameter.

GET  /posting/          controllers.posting.BlogController.allPosts(number: Int ?= 0)

GET /posting/:number controllers.posting.BlogController.allPosts(number: Int)




回答3:


You can also use Optional Parameters. Something like

GET  /posting/          controllers.posting.BlogController.allPosts(number: Option[Int])
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

Then you can call this with or without a parameter in the query:

/posting?number=1
/posting

Make sure you declare an Option as well in your controller



来源:https://stackoverflow.com/questions/23314907/play-framework-routes-and-scala-predef-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!