【问题标题】:'Action not found' from production version of Play AppPlay 应用的生产版本中的“未找到操作”
【发布时间】:2020-10-24 14:51:10
【问题描述】:

我正在尝试 dockerize Play 2.8 Scala 应用程序。我按照文档 (https://www.playframework.com/documentation/2.8.x/Deploying) 中的说明和生成的目标 (sbt clean & sbt dist)。当我使用命令从提取的 zip 运行应用程序时:

sudo ./commentapi -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b

一切正常,但是当我尝试使用 Postman 与我的 REST API 通信时,我收到以下响应:

<!DOCTYPE html>
<html lang="en">

<head>
    

    <title>Not Found</title>

    <style type="text/css">
        html,
        body,
        pre {
            margin: 0;
            padding: 0;
            font-family: Monaco, 'Lucida Console', monospace;
            background: #ECECEC;
        }

        h1 {
            margin: 0;
            background: #AD632A;
            padding: 20px 45px;
            color: #fff;
            text-shadow: 1px 1px 1px rgba(0, 0, 0, .3);
            border-bottom: 1px solid #9F5805;
            font-size: 28px;
        }

        p#detail {
            margin: 0;
            padding: 15px 45px;
            background: #F6A960;
            border-top: 4px solid #D29052;
            color: #733512;
            text-shadow: 1px 1px 1px rgba(255, 255, 255, .3);
            font-size: 14px;
            border-bottom: 1px solid #BA7F5B;
        }
    </style>
</head>

<body>
    
    <h1>Not Found</h1>

    <p id="detail">
        For request 'POST /comments'
    </p>

</body>

</html>

当我打开 routes.config 文件时,路由就在那里。此外,当我直接从 IntelliJ 运行我的应用程序时,一切正常。我想这是否可能是数据库连接的问题,因为我使用的是 Slick,并且由于某种原因,如果数据库没有运行,我的应用程序不会崩溃。但这会很奇怪,因为在这种情况下,我应该得到一个异常或一些关于数据库未运行的信息。

如果您知道更简单的 dockerize play 应用程序的方法,我也将不胜感激有关该主题的任何建议。

build.sbt:

name := """commentapi"""

organization := "maciej"

version := "1.0"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.2"

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  artifact.name + "." + artifact.extension
}

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.slick" %% "slick" % "3.3.2"
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.3.2"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.14"

routesImport += "constants.SortingOrder.Order"

dockerExposedPorts in Docker := Seq(9000, 9443)

// Adds additional packages into Twirl
//TwirlKeys.templateImports += "maciej.controllers._"

// Adds additional packages into conf/routes
// play.sbt.routes.RoutesKeys.routesImport += "maciej.binders._"

routes.config:

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

POST    /comments                                   controllers.CommentController.createComment()
PUT     /comments/:id                               controllers.CommentController.updateComment(id: Long)
DELETE  /comments/:id                               controllers.CommentController.deleteComment(id: Long)
GET     /comments                                   controllers.CommentController.getAllComments(order: Option[Order], filter: Option[String], prefix: Option[String])

application.conf:

play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n"
play.server.pidfile.path=/dev/null

db {
  driver: "slick.jdbc.PostgresProfile$"
  db {
    url = "jdbc:postgresql://localhost/commentapp"
    user = maciej
    password = admin
    driver = org.postgresql.Driver
    maxThreads = 5
  }
}

hosts {
    allowed = "localhost:9000"
}

【问题讨论】:

  • 您也可以发布服务器端日志吗?在生产模式下,Play 不会向客户端返回异常信息(出于安全原因),因此服务器日志中可能会有更多详细信息。
  • @TimMoore 我在本地运行它并且没有日志。启动应用程序时,终端中直接只有一些标准日志:2020-07-04 12:26:05 INFO play.api.Play Application started (Prod) (no global state) 2020-07-04 12:26:05 INFO play.core.server.AkkaHttpServer Listening for HTTP on /0:0:0:0:0:0:0:0:9000
  • @Maciej_97 - 你能把 allowed 设置为 allowed = ["."] 再试一次吗?

标签: scala playframework sbt sbt-native-packager


【解决方案1】:

我在使用 Play Framework 2.8 (Java) 时遇到了同样的问题。 问题出在 .Dockerfile 上。我忘记将播放的“/public”文件夹复制到容器中。 并且项目在没有资产的情况下成功构建。 (我仍然想知道为什么项目成功构建。在这种情况下它应该失败)。 将复制命令“COPY ./public /root/app/public”(请注意您可能有不同的目标文件夹)添加到 .Dockerfile 后,一切都开始工作了。

Docker file

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2015-09-29
    • 2011-08-24
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多