【问题标题】:HTTPS Status 500 after deploy on Heroku - Java, Maven在 Heroku 上部署后的 HTTPS 状态 500 - Java、Maven
【发布时间】:2018-10-09 21:38:06
【问题描述】:

我使用 Java 和 Maven 创建了一个 Web 应用程序(这是我的项目:https://github.com/lkobylanski/Parking_Book_System_Java)。其简单的停车位预订系统。它在我当地的 tomcat 上运行良好。但是,当我使用 WAR 部署在 Heroku 上部署它时:https://devcenter.heroku.com/articles/war-deployment

应用程序运行,但每次我尝试对 DB 执行任何操作时都会收到 500 服务器错误,例如添加新预订或获取 API,无论是特定停车位还是全球所有预订。这是错误:

HTTP Status 500 – Internal Server Error

Type Exception Report

Message java.lang.IllegalStateException: Could not initialize database

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: java.lang.IllegalStateException: Could not initialize database
    com.pbs.web.jdbc.ParkingBookSystem.BookControllerServlet.init(BookControllerServlet.java:40)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)

Root Cause

java.lang.IllegalStateException: Could not initialize database
    com.pbs.web.jdbc.ParkingBookSystem.BookDbUtil.<init>(BookDbUtil.java:27)
    com.pbs.web.jdbc.ParkingBookSystem.BookControllerServlet.init(BookControllerServlet.java:37)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)

Root Cause

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    javax.naming.InitialContext.lookup(InitialContext.java:417)
    com.pbs.web.jdbc.ParkingBookSystem.BookDbUtil.<init>(BookDbUtil.java:24)
    com.pbs.web.jdbc.ParkingBookSystem.BookControllerServlet.init(BookControllerServlet.java:37)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)

Note The full stack trace of the root cause is available in the server logs.
Apache Tomcat/8.5.33

这是我连接到我的数据库的方式: 我有一个 context.xml 文件放在 root/src/main/webapp/META-INF

看起来像(用户名和密码不是真实的):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Context path="/ParkingSystem">
    <Resource 
        name="jdbc/ParkingBookSystem" 
        auth="Container"
        type="javax.sql.DataSource"
        maxTotal="20"
        maxIdle="5"
        maxWaitMillis="10000"
        username="username"
        password="password"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://sql2.freemysqlhosting.net:3306/sql2226123"
    />
</Context>

这里是连接构造方法:

public BookDbUtil() {
    try {
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        dataSource = (DataSource) envContext.lookup("jdbc/ParkingBookSystem");
    } catch (NamingException e) {
        throw new IllegalStateException("Could not initialize database", e);
    }
}

编辑: 我已经采取了以下步骤:

  1. 运行:heroku config:set WEBAPP_RUNNER_OPTS="--enable-naming --context-xml=C:\context\context.xml 为我的 context.xml 添加了真实路径
  2. 使用以下命令:heroku war:deploy D:\Luki\Archiwum\WARfiles\ParkingBookSystem.war --includes context.xml

并得到以下错误:

Uploading ParkingBookSystem.war
-----> Packaging application...
       - app: parking-booking
       - including: context.xml
 ! ERROR: There was an error packaging the application for deployment.
 !        Re-run with HEROKU_DEBUG=1 for more info.
 !    There was a problem deploying to parking-booking.
 !    Make sure you have permission to deploy by running: heroku apps:info -a parking-booking

【问题讨论】:

  • 您是如何尝试连接到您的数据库的? (请edit您的问题并添加相关代码。我们不应该去场外理解您的问题。)
  • 为什么你是 freemysqlhosting.net 而不是提供 MySQL 的 Heroku addons 之一?
  • 因为当我创建项目时,我什至不了解heroku。无论如何,如果 mySQL 服务器有效并且数据有效,它不应该工作吗?
  • 我不确定。我从来没有听说过freemysqlhosting.net,它看起来很业余。谁知道他们如何运行他们的服务?显然存在连接问题。但是无论如何,如果您在创建项目时了解 Heroku,这又有什么关系呢?确定您的数据库配置可以从一个环境更改为另一个环境?
  • 是的,它可能可以:) 到目前为止,我从未做过类似的事情。所以我可以只导出 ma 表,然后导入 heroku,然后只需更改 context.xml 中的数据库数据,它应该可以工作吗?但是,我只是好奇为什么它现在不起作用。

标签: java database maven heroku http-status-code-500


【解决方案1】:

您需要将Tomcat webapp-runner 选项--enable-naming--context-xml=path/to/context.xml 添加到您的WEBAPP_RUNNER_OPTS,如下所示:

$ heroku config:set WEBAPP_RUNNER_OPTS="--enable-naming --context-xml=path/to/context.xml"

您需要 context.xml 是 WAR 之外的文件,并且需要在 Heroku Java CLI 中包含 --include 选项。

【讨论】:

  • 嘿,我已经更新了我的问题,因为我已经完成了你向我展示的步骤,但我卡住了。我已经尝试使用包含在我的问题中编辑的内容。还尝试了第一次部署 WAR 文件,然后包含 context.xml。我找不到问题所在。
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 2021-10-20
  • 2021-10-17
  • 2022-01-17
  • 1970-01-01
  • 2019-05-05
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多