java - Java 中的 Google App Engine 崩溃并出现 'AccessControlException: access denied...' 异常

标签 java mysql google-app-engine jdbc google-cloud-sql

基本上尝试通过我的 Eclipse Java Web 项目连接到我的 Cloud SQL 数据库

list

1) Updated my Google App Engine SDK to the latest 1.9.34 version

2) Updated my JDBC com.mysql.jdbc.Driver to the latest 5.1.38 version

3) Added the JDBC Driver to the build path

我根本无法连接到 Google Cloud SQL,并因以下错误而崩溃:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
    at java.security.AccessController.checkPermission(AccessController.java:559)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:429)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:454)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.Thread.init(Thread.java:391)
    at java.lang.Thread.init(Thread.java:349)
    at java.lang.Thread.<init>(Thread.java:445)
    at java.util.TimerThread.<init>(Timer.java:499)
    at java.util.Timer.<init>(Timer.java:101)
    at java.util.Timer.<init>(Timer.java:146)
    at com.mysql.jdbc.ConnectionImpl.<clinit>(ConnectionImpl.java:208)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:191)
    at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
    at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:65)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:283)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:233)
    at com.dinuka.myapp.servlets.PlanServlet.doPost(PlanServlet.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

搜索了一整天,逐字逐句地浏览了 Stackoverflow 上的每个相关问题。我正要把头发拔出来:D

这是我连接到数据库的极其简单的代码。不敢相信我做错了什么:

public class MyServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        String url = null;
        try {
            if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
                // Load the class that provides the new "jdbc:google:mysql://" prefix.
                Class.forName("com.mysql.jdbc.GoogleDriver");
                url = "jdbc:google:mysql://app_id:instance_id/data?user=root";
            } else {
                // Local MySQL instance to use during development.
                Class.forName("com.mysql.jdbc.Driver");
                url = "jdbc:mysql://instance-ip:3306/data?user=root";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        PrintWriter out = resp.getWriter();
        try {
            Connection conn = DriverManager.getConnection(url);
            System.out.println("Connection established");
            out.println("Connection established");
            try {
            } finally {
                conn.close();
            }
        } catch (SQLException e) {
            out.append(e.getMessage());
            e.printStackTrace();
        }
    }

}

Google 团队请修复此错误!与此同时,有人可以帮助我解决这个问题吗?

最佳答案

终于!修复!对于任何面临这个问题的人。以下是修复方法!

第 1 步:保持道德高尚并保持积极态度(相信我,我知道)

第 2 步:将您的 Google App Engine SDK 更新到最新版本。从此链接查看最新的 SDK => https://cloud.google.com/appengine/downloads

第 3 步:将您的 JDBC 驱动程序更新到最新版本。从此链接查看最新信息 => https://dev.mysql.com/downloads/connector/j/

第 4 步:以下是如何将 JDBC jar 正确添加到项目中:将其复制并粘贴到 lib 文件夹 (war/WEB-INF/lib)。右键单击您的 Eclipse 项目,然后单击“构建路径”->“配置构建路径”。单击“添加 JAR”并转到 lib 文件夹并选择刚刚复制的 mysql-connector-java 文件。单击“应用”并单击“确定”。

第 5 步:清理并构建您的项目

第 6 步:我不知道这是否有必要,但无论如何我们还是这样做吧。右键单击您的项目并转到“属性”。

第 7 步:展开“Google”部分并选择 App Engine。确保已启用(选中)Google Cloud SQL,然后选择使用 Google Cloud SQL 实例单选按钮。

第 8 步:在该单选按钮的右侧,您将看到一个名为“配置”的链接。单击该按钮并在字段中填写您的实例名称、数据库名称等,然后单击“确定”。

第 9 步:在我们之前看到的单选按钮下方,您应该会在名为“App Engine SQL 实例”的标签旁边看到另一个名为“配置”的链接。单击配置并像我们之前一样填写实例名称、数据库名称等字段。单击“确定”并关闭“属性”窗口。

最后一步:再次清理并构建您的项目并运行它。如果您正确执行了所有步骤,您应该可以连接到强大的 Google Cloud。

我花了太多时间来解决这个问题,我知道我可以用这个答案来简化别人的一天。祝你好运!

-Dinuka Jayasuriya, future 的 Google 员工;)

关于java - Java 中的 Google App Engine 崩溃并出现 'AccessControlException: access denied...' 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261678/

相关文章:

php - 操作数组中的数据

mysql - 无法从rails连接到远程mysql服务器

java - jpa IllegalArgumentException异常

google-app-engine - Polymer 和谷歌云端点 Go 后端

python - 如何获取 App Engine Datastore 中的 ID 字段?

java - Java 扫描器类

c# - 有关如何链接、编译等以及它们如何组合在一起的书籍?

java - JRE 有诊断工具吗?

java - 使用 randomElement() 方法编写 Set 实现

MySQL-如何更新小数列以允许点后有更多数字