路由重载不起作用

时间:2013-10-11 03:13:01

标签: scala playframework-2.1 playframework-2.2

我希望能够拥有这个:

POST /items controllers.Application.update()
POST /items/:itemType controllers.Application.update(itemType: String)
POST /items/:itemType/:id controllers.Application.update(itemType: String, id: Int)

但由于method update is defined twice的错误而无法编译。然后我改变它,它也没有编译:

POST /items controllers.Application.update(itemType: Option[String] = None, id: Option[Int] = None)
POST /items/:itemType controllers.Application.update(itemType: String, id: Option[Int] = None)
POST /items/:itemType/:id controllers.Application.update(itemType: String, id: Int)

错误是:

  1. 前一个
  2. type mismatch; found: Option[String]; required: String
  3. 我该怎么办?我不会喜欢这样做:

    POST /items controllers.Application.updateAll()
    POST /items/:itemType controllers.Application.updateByType(itemType: String)
    POST /items/:itemType/:id controllers.Application.updateByTypeAndId(itemType: String, id: Int)
    

    并且看起来很好,因为我想使用Option而不是空字符串:

    POST /items controllers.Application.update(itemType: String = "", id: Int = "")
    POST /items/:itemType/:id controllers.Application.update(itemType: String, id: Int = "")
    POST /items/:itemType/:id controllers.Application.update(itemType: String, id: Int)
    

2 个答案:

答案 0 :(得分:1)

不幸的是,似乎在v2中删除了对Option的支持 - 例如,请参阅here - 因此您可能会遇到编写自己的PathBindable代码来处理选项(如上面链接中所述),或者你注意到的其他一些令人讨厌的选择。

答案 1 :(得分:1)

如果您能够更改网址格式,则可以使用选项。

路线:POST /items controllers.Application.update(itemType: Option[String], id: Option[Int])

网址:http://localhost:9000/items?itemType=someItem&id=123

使用此格式,您可以在进行Web服务调用时省略itemType,id或两者。