播放框架路由和scala predef值

时间:2014-04-26 18:26:33

标签: 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 {

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

当我试图加入时,我给出了一个错误:

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)

我无法理解如何解决这个问题。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:9)

您必须使用带默认值的参数:

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您还可以使用可选参数。像

这样的东西
GET  /posting/          controllers.posting.BlogController.allPosts(number: Option[Int])
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

然后你可以在查询中使用或不使用参数调用它:

/posting?number=1
/posting

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