天道酬勤,学无止境

播放框架路由和 Scala 预定义值(Play framework routes, and scala predef values)

问题

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

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

和博客控制器:

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

当我尝试 comile 时,我给出了一个错误:

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)

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

回答1

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

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

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

回答2

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

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

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

回答3

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

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

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

/posting?number=1
/posting

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

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 播放应用程序的编译问题(Problems with Compiling Play Application)
    问题 我在编译我的游戏框架应用程序时遇到了一些问题。 有时,应用程序运行良好,但大多数情况下,这些问题都是通过sbt和activator工具出现的。 这是一个使用sbt编译我的应用程序的示例: [info] Compiling 15 Scala sources and 1 Java source to C:\Server\trunk\target\scala-2.11\classes... [error] C:\Server\trunk\target\scala-2.11\src_managed\main\controllers\routes.java:8: error: cannot find symbol [error] public static final controllers.ReverseAssets Assets = new controllers.ReverseAssets(); [error] ^ [error] symbol: class ReverseAssets [error] location: package controllers [error] C:\Server\trunk\target\scala-2.11\src_managed\main\controllers\routes.java:9: error: cannot find symbol
  • 为路由中的可选查询参数分配空默认值 - Play Framework(assign null default value for optional query param in route - Play Framework)
    问题 我正在尝试定义一个可选的查询参数,该参数将映射到Long ,但当它不存在于 URL 中时将为null : GET /foo controller.Foo.index(id: Long ?= null) ...我基本上想检查它是否被传入: public static Result index(Long id) { if (id == null) {...} ... } 但是,我收到编译错误: 类型不匹配; found : Null(null) required: Long 请注意,隐式转换不适用,因为它们是不明确的:类型 (x: Null)Long 的类 LowPriorityImplicits 中的方法 Long2longNullConflict 和类型 (x: Long)Long 的对象 Predef 中的方法 Long2long 都是从 Null(null) 到 Long 的可能转换函数 为什么我不能这样做,将null指定为预期Long可选查询参数的默认值? 有什么替代方法可以做到这一点? 回答1 请记住,路由中的可选查询参数的类型是scala.Long ,而不是java.lang.Long 。 Scala 的 Long 类型等同于 Java 的原始long ,不能赋值为null 。 将id更改为java.lang.Long类型应该可以修复编译错误
  • 播放框架:将路线拆分为多个文件,而无需子项目(Play Framework: split routes in multiple files without sub projects)
    问题 我的游戏项目很大,路由文件约为1Mb。 现在,当scala编译时,由于从我的路由文件创建的路由和反向路由scala文件(也很大),我会遇到“方法代码太大”的异常。 因此,我需要在没有子项目的情况下拆分路由文件。 确实,我不能将我的项目分成子项目,因为它的组件是相互依赖的。 我尝试了2种方法: 我添加了一个名为technical.routes的新conf文件,在其中添加了一些路由,从“ routes”中删除了相同的路由,并使用“-> technical.Routes”导入了该文件。出现问题是因为当它停止编译时,它会一遍又一遍...永远不会结束。 我添加了一个新的conf文件,称为technical.routes,在其中添加了一些路由,从“ routes”中删除了相同的路由,但是没有将其导入到我的主路由文件中,而是将其添加到conf文件中:“ application.router =“路线,技术路线”。 但这是行不通的,因为在这里只能声明一条路由。 请怎么做? 回答1 好吧,第一种方法正在起作用。 我从头开始,它奏效了。 在编译命令之前,我做了一个干净的命令。 看来旧的编译文件是造成我问题的原因。 请注意,路由文件中的程序包名称不能重叠。 例如,在此示例中, technical.routes文件包含controllers.technical中的所有路由
  • 无法解决IntelliJ中的反向路由方法(Unable to resolve reverse routing methods in IntelliJ)
    问题 我正在关注其中一个播放框架教程,但是每当尝试使用反向路由时,都会出现编译错误。 首先, public static Result javascriptRoutes() { response().setContentType("text/javascript"); return ok( Routes.javascriptRouter("jsRoutes", controllers.routes.javascript.Projects.add(), controllers.routes.javascript.Projects.delete(), controllers.routes.javascript.Projects.rename(), controllers.routes.javascript.Projects.addGroup() ) ); } intelliJ中显示的错误是“无法解析方法javascriptRouter(java.lang.String,?,?,?,?)” 而且在单元测试中: @Test public void notAuthenticated() { Result result = callAction( controllers.routes.ref.Application.index(), fakeRequest() ); assertEquals
  • 播放框架:如何更改路线更改时的活动类(Play Framework: How do I change active class on route change)
    问题 我在我的项目中使用 Play Framework 2 for Java 和 Bootstrap Helper,我想在侧边栏链接单击上应用active类。 我使用侧导航栏进行导航,默认情况下,一个链接在页面加载时始终具有active类,这就是为什么每次只有一个链接突出显示为活动链接,但如何更改路线上的class="active"或者链接更改,有什么办法可以检查路由路径是我们的html scala模板文件。 这是我的侧边栏导航代码。 <ul class="nav nav-list"> <li class="active"><a href="/menu1">Menu1</a></li> <li><a href="/menu2">Menu2</a></li> <li><a href="/menu3">Menu3</a></li> </ul> 这是我的routes文件 GET /menu1 com.demo.project.controllers.DemoController.menu1() GET /menu2 com.demo.project.controllers.DemoController.menu2() GET /menu3 com.demo.project.controllers.DemoController.menu3() 请给我一些建议! 回答1
  • Play framework routes, and scala predef values
    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; }
  • 我可以在 Play Framework 2.x (Scala) 中进行异步表单验证吗?(Can I do async form validation in Play Framework 2.x (Scala)?)
    问题 我正在努力理解 Play 的异步功能,但在适合异步调用的地方和框架似乎合谋反对其使用的地方发现了很多冲突。 我的示例与表单验证有关。 Play 允许定义临时约束 - 请参阅文档中的内容: val loginForm = Form( tuple( "email" -> email, "password" -> text ) verifying("Invalid user name or password", fields => fields match { case (e, p) => User.authenticate(e,p).isDefined }) ) 漂亮干净。 但是,如果我使用的是完全异步的数据访问层(例如 ReactiveMongo),那么对User.authenticate(...)的调用将返回一个Future ,因此我对如何利用该功能User.authenticate(...)内置的表单绑定功能和异步工具。 宣传异步方法很好,但我对框架的某些部分不能很好地使用它感到沮丧。 如果验证必须同步完成,似乎就违背了异步方法的意义。 我在使用Action组合时遇到了类似的问题 - 例如,一个安全相关的Action会调用 ReactiveMongo。 任何人都可以阐明我的理解力不足的地方吗? 回答1 是的,Play 中的验证是同步设计的。
  • 在Controller中使用路由时IntelliJ IDEA报告突出显示错误(IntelliJ IDEA Report Highlighting error when using routes in Controller)
    问题 我有一个Scala Play项目。 我正在使用Play 2.2.1。 我下载了Scala,Play 2支持和SBT插件。 一切正常,但是当我在Controller中调用Action上的route时,出现以下错误(请看屏幕截图): 我正在使用IntelliJ IDEA 12.1.6 Ultimate版本。 Scala版本2.10.2 有人知道如何解决此问题吗? 提前致谢! 编辑 当我在播放控制台中通过“播放提示”命令将项目生成到Intellij IDEA时,我在IDEA中打开的项目结构如下: 然后,我看到了答案@millhouse,并在此githup上进行了讨论([Play 2.2]“ play idea”在目标中创建了无效的源映射),然后从Sources Folders中删除了以下文件夹: target \ scala-2.10 \ src_managed \ main \ controllers target \ scala-2.10 \ src_managed \ main \ views 和“报告突出显示错误”消失了,但是现在又出现了另一个错误: 和 我的路线: 而且我更改了“源文件夹”,如下所示: 但这对我没有帮助。 并保持“未指定值参数”错误。 回答1 米尔豪斯的答案帮助我找到了正确的答案。 Play 2.2(可能尚未检测到较早的版本
  • 播放框架2:阅读Build.scala中定义的应用程序版本(Play Framework 2: Read the application version defined in Build.scala)
    问题 我使用Play Framework 2.0(2.0.3)。 我有一个Java项目,想阅读appVersion定义的应用程序版本( appVersion )。 我已经看到的是,可以从提供给Global.java的Application对象中读取某些配置详细信息,但是找不到名为appVersion或类似的键。 回答1 您可以在application.conf定义版本,并让Build.scala读取该值。 我使用版本号和应用程序名称来完成此操作。 以下在Play 2.0中起作用,Play 2.1有更新的解决方案。 在project/Build.scala ,加载配置并获取属性: val conf = play.api.Configuration.load(new File(".")) val appName = conf.getString("app.name").getOrElse("unnamed application") val appVersion = conf.getString("app.version").getOrElse("0.0.0") 在conf/application.conf定义属性: app.version = 1.0 app.name = My Application 最后,在您的应用程序中,可以使用 Play.application()
  • 如何在Scala Play框架中对服务器启动执行操作?(How do I perform an action on server startup in the Scala Play Framework?)
    问题 我在conf/目录中有一个配置文件servers.conf ,每当路由/servers命中时,我的ServerController就会读取该配置文件。 这不是有效的,因为在文件连续更改时,每次连续命中时都需要重新读取配置文件。 此外,如果配置文件存在问题,我可以尽快告诉用户,而不是在页面点击时抛出异常。 目前我在ServerController.scala有这个: case class Server(ip: String, port: String) /** * This controller creates an `Action` to handle HTTP requests to the * application's server page. */ @Singleton class ServerController @Inject() extends Controller { /** * Create an Action to render an HTML page with a the list of servers. * The configuration in the `routes` file means that this method * will be called when the application receives a `GET`
  • 如何在Play Framework 2.x中使用Twitter Bootstrap 2(How to use Twitter Bootstrap 2 with play framework 2.x)
    问题 我知道目前的Play! 发行版具有Bootstrap 1.4的帮助程序。 如果要使用当前版本的Bootstrap应该怎么办? 回答1 我在Play 2.0中使用2.0.1 twitter引导程序。 您可以在此处下载特定版本:https://github.com/twitter/bootstrap/tags。 下载twitter引导程序后,您有两个选择: 您可以选择只使用bootstrap.min.css (和bootstrap-responsive.css )和bootstrap.min.js ,所有这些文件都可以放在公共文件夹中。 或者您可以将较少的文件用于CSS。 如果要使用较少的文件,请制作以下程序包(在您的应用文件夹的根目录中): asset.stylesheets.bootstrap 在构建scala中,您定义应编译以下.less文件: // Only compile the bootstrap bootstrap.less file and any other *.less file in the stylesheets directory def customLessEntryPoints(base: File): PathFinder = ( (base / "app" / "assets" / "stylesheets" / "bootstrap" *
  • Play Framework for Scala:编译错误[类型应用程序不是软件包控制器的成员](Play Framework For Scala: Compilation error[type Application is not a member of package controllers])
    问题 我尝试在该书中编译一个Scala示例:“ Play for Scala”,但在Play控制台上收到以下编译错误: C:\Play\exp\ch6_implicits>activator run [info] Loading project definition from C:\Play\exp\ch6_implicits\project [info] Set current project to ch6_implicits (in build file:/C:/Play/exp/ch6_implicits/) --- (Running the application, auto-reloading is enabled) --- [info] p.a.l.c.ActorSystemProvider - Starting application default Akka system: application [info] p.c.s.NettyServer$ - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 (Server started, use Ctrl+D to stop and go back to the console...) [info] Compiling 13 Scala sources and 1 Java
  • Problems with Compiling Play Application
    I have been running into a few problems with compiling my play framework application. Sometimes the application runs fine but most of the time these problems both occur with the sbt and activator tools. Here is an example of compiling my application with sbt: [info] Compiling 15 Scala sources and 1 Java source to C:\Server\trunk\target\scala-2.11\classes... [error] C:\Server\trunk\target\scala-2.11\src_managed\main\controllers\routes.java:8: error: cannot find symbol [error] public static final controllers.ReverseAssets Assets = new controllers.ReverseAssets(); [error] ^ [error] symbol: class
  • 在Play Framework 2应用中检索端口号(Retrieving port number in Play Framework 2 app)
    问题 问题是:无论如何定义(配置,命令行参数,或者根本不定义),我如何检索正在播放的端口号。 此答案使用Play Framework在应用程序中检索端口号必须适用于Play v1,因为该代码无法编译。 在Play 2 Java中,有: Integer port = Play.application().configuration().getInt("http.port"); 这不会返回实际的端口号,至少在所有情况下都不会。 如果Play的运行方式为: run 80 -Dhttp.address=example.com 然后返回null 。 如果以 run -Dhttp.port 80 -Dhttp.address=example.com 然后在默认端口(9000)上开始播放。 正如biesior所指出的,它通过两次提及端口来起作用: play -Dhttp.port=80 "run 80" 当然哪个不是最佳选择,因为一个是Play实际使用的东西,另一个是它报告的东西。 但这会回答我关于开发人员模式的问题。 但是,正如文档所述,Play绝对不能使用在prod中run 。 那么start命令的等效项是什么,还有没有更好,更安全的方法呢? (我对Java版本感兴趣,但是其他人也可能想了解Scala。) 回答1 在开发人员模式下运行,您需要使用双倍符号 play -Dhttp.port
  • 在Play!Framework中批处理HTTP请求(Batch HTTP requests in Play!Framework)
    问题 我已经实现了当前的一组路由(例如): GET /api/:version/:entity my.controllers.~~~~~ GET /api/:version/:entity/:id my.controllers.~~~~~ POST /api/:version/:entity my.controllers.~~~~~ POST /api/:version/:entity/:id my.controllers.~~~~~ DELETE /api/:version/:entity my.controllers.~~~~~ POST /api/:version/search/:entity my.controllers.~~~~~ 他们工作得很漂亮。 现在,假设我要为同一API实现“批处理终结点”。 它看起来应该像这样: POST /api/:version/batch my.controllers.~~~~~ 身体应该像这样: [ { "method": "POST", "call": "/api/1/customer", "body": { "name": "antonio", "email": "tonysmallhands@gmail.com" } }, { "method": "POST", "call": "/api/1/customer/2", "body"
  • 有哪些Scala网络框架可用? [关闭](What Scala web-frameworks are available? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 6年前关闭。 改善这个问题 我刚刚开始学习Scala,首先要实现的是一个小型Web应用程序。 去年,我一直在使用Erlang来实现服务器端软件,但是我以前从未编写过Web应用程序。 这将是一个很好的经验。 除Lift之外,Scala是否有网络框架? 不要误会我的意思,Lift看起来很棒。 我只想知道有多少个框架,以便可以在它们之间进行选择。 选择总是一件好事,但我发现的唯一东西是Lift。 回答1 我对Scala很有兴趣,但是我还没有使用过,因此,需要注意的是,HRJ的答案(Lift,Sweet,Slinky)中没有提到我所知道的框架: Scalatra,以前为Step(在GitHub上) 播放2(在GitHub上) 小指 回答2 我写了一篇关于这个的博客文章。 概括地说,一些选项是: 举起甜的紧身的 最终,我发现没有一个适合我,并开发了自己的小“框架”。 (它还不是开源的)。 回答3 我喜欢Lift ;-) 对于Scala友好的Web框架,Play是我的第二选择。 小门是我的第三选择。 回答4 以下是框架的转储。 这并不意味着我实际上使用了它们: 库厄斯。 用于Scala的传统MVC Web框架。 未过滤。
  • 在 FakeRequest 中使用 MultipartFormData 播放框架测试(Play Framework Testing using MultipartFormData in a FakeRequest)
    问题 我目前正在为 May Play Framework 2.2.x 应用程序编写一些 Specs2 测试,该应用程序接受 MultipartFormData 提交作为其功能的一部分。 我已经使用以下形式成功地用文本和 JSON 主体编写了其他测试: "respond to POST JSON with description field present" in { running(FakeApplication()) { val response = route(FakeRequest(POST, "/submission.json").withJsonBody(toJson(Map("content" -> toJson("test-content"), "description" -> toJson("test-description"))))).get status(response) must equalTo(OK) contentType(response) must beSome.which(_ == "application/json") contentAsString(response) must contain(""""description":"test-description"""") contentAsString(response) must
  • Scala IDE 4.0.0认为现成的Play Framework 2.3.7程序中存在错误(Scala IDE 4.0.0 thinks there's errors in an out-of-the-box Play Framework 2.3.7 program)
    问题 我已经通过Typesafe Activator创建了一个Play Framework程序(因此它完全遵循模板)。 我使用sbteclipse-plugin版本3.0.0创建了一个Eclipse项目,并将其导入到Scala IDE 4.0.0中。 这些是撰写本文时的所有最新版本。 Scala IDE似乎确实支持Play框架。 它为自定义格式(包括路由文件和模板)突出显示了语法。 但是,它似乎无法从控制器中找到视图。 特别是,对views.html.index的调用会触发错误:“对象索引不是views.html包的成员”。 我尝试使用本机挂钩或池来启用刷新(如此处所述),但没有任何效果。 我应该注意,虽然代码是在命令行中编译的(使用activator ~run ),但由于我不知道如何(在任何地方都没有记录),它尚未在Scala IDE中进行编译。 。 我该怎么做才能消除这些错误错误? 编辑:运行activator clean ~run clean〜run之后,我还有另一个错误:在解决构建路径错误之前无法构建项目。 这些构建路径错误是什么没有更多详细信息。 回答1 更新:只需升级到sbteclipse版本5.1.0 ,一切都应立即sbteclipse 。 另外,请确保遵循Play文档中有关如何设置Eclipse / ScalaIDE的信息。 这是sbteclipse的已知错误
  • Play Framework 2.1-AngularJS路由-最佳解决方案?(Play Framework 2.1 - AngularJS routing - best solution?)
    问题 我正在通过AngularJS教程进行工作。 Angular使用它自己的JS路由机制来允许单页应用程序。 Angular的示例路由文件如下所示: angular.module('phonecat', []). config(['$routeProvider', function($routeProvider) { $routeProvider. when('/phones', {templateUrl: '/partials/phone-list', controller: PhoneListCtrl}). when('/phones/:phoneId', {templateUrl: 'partials/phone-detail', controller: PhoneDetailCtrl}). otherwise({redirectTo: '/phones'}); }]); 我试图找到一个存储我的局部文件(特定于Angular的HTML文件)的好地方。 理想情况下,我希望能够从Play中对其进行模板化(例如,将它们作为* .scala.html文件)。 我可以使用如下所示的Play路由文件来完成此操作: GET /partials/phone_index controllers.Application.phone_index 我基本上偏向于这样的控制器动作: def phone
  • 如何在Scala枚举中编写Reads [T]和Writes [T](播放框架2.1)(How to write Reads[T] and Writes[T] in scala Enumeration (play framework 2.1))
    问题 我对Play Framework 2.1中的新ScalaJson功能有些迷惑。 我想在枚举中写读和写。 这是我的代码: object EnumA extends Enumeration { type EnumA = Value val VAL1, VAL2, VAL3 = Value def parse(str:String) : EnumA = { str.toUpperCase() match { case "VAL1" => VAL1 case "VAL2" => VAL2 case "VAL3" => VAL3 case _ => null } }} 任何想法 ? 谢谢。 回答1 简短的答案:使用类似Play Enumeration Utils的工具。 长答案,而不是将“读取”放入您的枚举,您可以为“枚举”类型创建可重复使用的读取: object EnumA extends Enumeration { type EnumA = Value val VAL1, VAL2, VAL3 = Value } object EnumUtils { def enumReads[E <: Enumeration](enum: E): Reads[E#Value] = new Reads[E#Value] { def reads(json: JsValue): JsResult[E