【发布时间】:2019-08-15 01:58:57
【问题描述】:
我正在使用 Scala Web 框架 (Udash) 进行测试,并尝试在 Heroku 中运行一个玩具示例。按照 Heroku 文档中的说明,我让它在本地运行没有问题:
sbt compile stage
heroku local web
但是,一旦部署,我输入的任何 URL 都会转到 404,甚至是应用程序的着陆页。这些是我正在使用的对象:
object Launcher extends CrossLogging {
def main(args: Array[String]): Unit = {
val port = Properties.envOrElse("PORT", "5000").toInt
val server = new ApplicationServer(port, "frontend/target/UdashStatics/WebContent")
server.start()
logger.info(s"Application started...")
}
}
class ApplicationServer(val port: Int, resourceBase: String) {
private val server = new Server(port)
private val contextHandler = new ServletContextHandler
private val appHolder = createAppHolder()
contextHandler.setSessionHandler(new SessionHandler)
contextHandler.setGzipHandler(new GzipHandler)
contextHandler.getSessionHandler.addEventListener(new org.atmosphere.cpr.SessionSupport())
contextHandler.addServlet(appHolder, "/*")
server.setHandler(contextHandler)
def start(): Unit = server.start()
def stop(): Unit = server.stop()
private def createAppHolder() = {
val appHolder = new ServletHolder(new DefaultServlet)
appHolder.setAsyncSupported(true)
appHolder.setInitParameter("resourceBase", resourceBase)
appHolder
}
}
我是否缺少任何 Heroku 配置/特征?
编辑
尝试应用建议的更改并最终得到以下 ApplicationContext:
class ApplicationServer(val port: Int, val resourceBase: String) {
val server = new Server()
val connector = new ServerConnector(server)
connector.setPort(port)
server.addConnector(connector)
private val appHolder = createAppHolder()
val context = new ServletContextHandler(ServletContextHandler.SESSIONS)
context.setBaseResource(Resource.newResource(resourceBase))
context.setContextPath("/")
context.addServlet(appHolder, "/")
server.setHandler(context)
private def createAppHolder() = {
val appHolder = new ServletHolder("default", classOf[DefaultServlet])
appHolder.setInitParameter("dirAllowed", "true")
appHolder.setInitParameter("resourceBase", resourceBase)
appHolder
}
def start(): Unit = server.start()
def stop(): Unit = server.stop()
}
但是,即使在部署到 Heroku 后,我仍然在登录页面上收到错误 404:
HTTP ERROR 404
Problem accessing /. Reason:
Not Found
在本地运行应用程序时,我可以正确到达着陆页。
谢谢! 谢谢!
【问题讨论】:
-
你的代码是可以的,只要我在
resourceBase指向的目录下放一些东西通过浏览器获取即可。 (例如:我放了一个hello.html和一个简单的<h1>hello world</h1>,然后通过http://localhost:8080/hello.html访问它)