播放框架路由和scala predef值

播放框架路由和scala predef值,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,我在play framework 2.2上开发应用程序 我有一个如下的路由文件: GET /posting/ controllers.posting.BlogController.allPosts() GET /posting/:number controllers.posting.BlogController.allPosts(number: Int) 和BlogContriller: object BlogController extends Controller

我在play framework 2.2上开发应用程序 我有一个如下的路由文件:

GET  /posting/          controllers.posting.BlogController.allPosts()
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)
和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))
  }
}

我不明白如何解决这个问题。有人能帮我吗?

您可以使用带有默认值的参数:

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

您不能使用重载方法
allPosts(Int)
allPosts
。由于您使用两个带有默认值的参数声明了
allPosts
,Scala将此方法视为4种不同的方法。您只能使用其中一个。

您也可以使用可选参数。差不多

GET  /posting/          controllers.posting.BlogController.allPosts(number: Option[Int])
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)
然后,您可以在查询中使用或不使用参数调用它:

/posting?number=1
/posting

确保在控制器中也声明了一个选项

必须为同一函数定义所有参数。在您的情况下,
allPosts
。为不需要该参数的管线提供默认值

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

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

不起作用。我有一个新错误:“不允许为参数指定固定值或默认值:'number'从路径中提取”
GET  /posting/          controllers.posting.BlogController.allPosts(number: Int ?= 0)